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将在处理请求时将其作为中间件堆栈的一部分进行调用,并为其提供req
, res
和next
参数。
您可以通过检查arguments
对象来始终查看哪些parameter passing给函数。 (即console.log(arguments)
);
当express通过中间件链运行时,参数(req,res,next)被传递给它。 假设app.use是一个(更复杂)的版本:
app.use = function(middleware){ middlewareChain.push(middleware); }
当一个请求到达时,express通过中间件链运行,从头到尾。 第一个被定义的中间件被调用,当前req
, res
和next
,下next
中间件在链中。
在链的末尾, next
只是一个空的函数。 希望到那个时候,你已经做了一些res
对象(如res.send
)。
(2)被匿名函数包围,以便您可以将选项传递给app.use
。 例如,connect的cookieParser接受一个cookieSecret
。 如果您正在开发没有选项的中间件,那么用arity (req, res, next)
定义它并且跳过返回一个函数是可以接受的(但是不一致)。 在这种情况下,你可以简单地写app.use(myMiddleware)
。
ExpressJS中间件文档