关于Express的中间件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Express的中间件相关的知识,希望对你有一定的参考价值。

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进行匹配。

  注意,若想在一次请求中,执行多个中间件,应该让最后一个中间件去响应客户端请求,也就是说,转交控制权的中间件不允许再同时响应请求,否则会报错。

以上是关于关于Express的中间件的主要内容,如果未能解决你的问题,请参考以下文章

在 Apollo-Server v2 中间件之后如何使用 Express 中间件?

精华 对express中next函数的一些理解

在Express中,app.router到底做了什么?

教你编写 Node.js 中间件,实现服务端缓存(附demo源码)

教你编写 Node.js 中间件,实现服务端缓存(附demo源码)

express中间件