var app = require(‘express’)(); app.use(function(req,res,next){ console.log(‘请求成功。。。’); next(); }); app.get(’/’,function(req,res,next){ console.log(‘有一个错误被抛出。。。’); throw new Error(‘第一个错误’); }); app.use(’/’,function(req,res,next){ console.log(‘哈哈哈。。。’); }); app.use(’/’,function(error,req,res,next){ console.log(‘检测到错误但不传递’); next(); }); app.use(function(error,req,res,next){ console.log(‘检测并处理错误。’+error.message); res.send(‘500-服务器出错。’); }); app.use(function(req,res){ console.log(‘未处理错误。’); res.send(‘404-未找到页面。’); }); app.listen(3000,function(){ console.log(‘监听到端口 3000’); });
运行这一段代码,为什么请求成功会执行两次。。 运行结果: 监听到端口 3000 请求成功。。。 有一个错误被抛出。。。 检测到错误但不传递 未处理错误。 请求成功。。。 哈哈哈。。。
你看看req.path
应该是有一个请求图标的请求/favicon.ico
@William17 的确是favicon.ico的原因,但为什么console.log(‘哈哈哈。。。’),这个中间件也会被调用。req.path的路径是‘/favicon.ico’。。。
@beilunyang 你console.log(‘哈哈哈。。。’)
那中间件是app.use('/')
如果中间没出错,所有请求都会match
@William17 是不是app.use(’/’) == app.use(’/’) == app.use(); 都是匹配所有。。。而app.get(’/’) 则!=app.get(’/’);
@beilunyang
app.use([path,] function [, function...])
Mounts the middleware function(s) at the path. If path is not specified, it defaults to “/”.
Mounting a middleware at a path will cause the middleware function to be executed whenever the base of the requested path matches the path. Since path defaults to “/”, middleware mounted without a path will be executed for every request to the app.
app.METHOD(path, callback [, callback ...])
Routes an HTTP request, where METHOD is the HTTP method of the request, such as GET, PUT, POST, and so on, in lowercase.
app.use
是middleware, 只要req.path
以middleware的模式开始,就会被执行
app.METHOD
是route,需要req.path
匹配route的模式,才可能被执行
最好自己看文档和例子…
先用markdown把实例代码组织好, 这一眼就不想看问题了