var express = require(‘express‘)
var app = express()
app.use(‘/‘,function(req,res,next){
console.log(1)
})
app.get(‘/‘,function(req,res,next){
console.log(2)
})
app.listen(3000)
express 中间件的执行,和它所处的位置很有关系。
代码运行之后,会将前台发送来的url与中间件中的path进行匹配,当url匹配到一个中间件的path匹配成功后,就执行当前的中间件,后面的中间件将不再执行。
所以,对于以上代码,若前端请求的url是‘/‘,则后台只会输出 1,后面的中间件不会再执行下去。
若想继续执行下面的中间件,可以使用 next() 函数转交控制权
var app = express()
app.use(‘/‘,function(req,res,next){
console.log(1)
next()
})
app.get(‘/‘,function(req,res,next){
console.log(2)
})
app.listen(3000)
将代码改成上面的形式,在第一个中间件中使用next()函数,那么控制权就转交给了下一个中间件。所以后台会输出 1 和 2;
注意:
若在中间件中已经向客户端响应过请求后,就不允许在使用next() 函数转交控制权。例如
var app = express()
app.use(‘/‘,function(req,res,next){
console.log(1)
res.send(‘a‘)
next()
})
app.get(‘/‘,function(req,res,next){
console.log(2)
})
app.listen(3000)
以上代码会报错:Can‘t set headers after they are sent。
其实很好理解,当前的中间件都已经响应过请求了,响应已经结束了,又如何再去转交控制权呢?
总结:
对于中间件的执行,按照前端的url与中间件的path匹配,若匹配成功,执行当前中间件,后面的中间件不再执行。
若想让后面的中间件继续执行,则在当前执行的中间件中使用next()函数,将控制权转交给下面的中间件,前端url继续和下面的中间件的path进行匹配。
注意,若想在一次请求中,执行多个中间件,应该让最后一个中间件去响应客户端请求,也就是说,转交控制权的中间件不允许再同时响应请求,否则会报错。