ExpressJS中间件req,res,next范围

在研究了一些中间件之后,我还有一个问题。

看看下面的工作设置,它只是将req对象的do函数连接起来,以便我们可以像req.doit()那样在任何路由中调用它。

但是, req,res,next从何而来?我从来没有通过过,我更加好奇它是如何工作的,因为匿名函数(2.)被另一个函数(1.)所包围,我甚至可以传递参数。

MiddleWareTest.js:

 var test = function(options){ //1.) return function(req, res, next) { //2.) req.doit = function() { console.log('doit') } next(); } } module.exports = test; 

app.js:

 ... var myMiddleware = require('./MiddlewareTest.js') app.use(myMiddleware()) ... 

任何build议,以加深我的知识,欢迎:)

〜马克

记住函数是JS中的对象,所以它们可以像任何其他对象一样被传递和返回。

当您告诉express使用您的中间件时,您正在调用myMiddleWare函数:

 app.use(myMiddleWare()); 

这个调用返回你标记为\\2.的匿名函数\\2. 。 Express.js将在处理请求时将其作为中间件堆栈的一部分进行调用,并为其提供reqresnext参数。

您可以通过检查arguments对象来始终查看哪些parameter passing给函数。 (即console.log(arguments) );

当express通过中间件链运行时,参数(req,res,next)被传递给它。 假设app.use是一个(更复杂)的版本:

 app.use = function(middleware){ middlewareChain.push(middleware); } 

当一个请求到达时,express通过中间件链运行,从头到尾。 第一个被定义的中间件被调用,当前reqresnext ,下next中间件在链中。

在链的末尾, next只是一个空的函数。 希望到那个时候,你已经做了一些res对象(如res.send )。

(2)被匿名函数包围,以便您可以将选项传递给app.use 。 例如,connect的cookieParser接受一个cookieSecret 。 如果您正在开发没有选项的中间件,那么用arity (req, res, next)定义它并且跳过返回一个函数是可以接受的(但是不一致)。 在这种情况下,你可以简单地写app.use(myMiddleware)

ExpressJS中间件文档