Node.js ExpressJS中间件请求,res,下一个作用域
在研究了一些中间件之后,我仍然有一个问题 看看下面的工作设置,它只是将doit函数附加到req对象,这样我们就可以在任何路由中调用它,就像Node.js ExpressJS中间件请求,res,下一个作用域,node.js,express,connect,Node.js,Express,Connect,在研究了一些中间件之后,我仍然有一个问题 看看下面的工作设置,它只是将doit函数附加到req对象,这样我们就可以在任何路由中调用它,就像req.doit() 但是请求,res,next来自哪里?, 我从未传递过它们,我更好奇它是如何工作的,因为匿名函数(2.)被另一个函数(1.)包围着,我甚至可以传递参数 MiddleWareTest.js: var test = function(options){ //1.) return function(req, res, next) { //
req.doit()
但是请求,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())
...
欢迎提出任何加深我知识的建议:)
~Marc当express在中间件链中运行时,参数(req、res、next)将传递给它。假设app.use是以下内容的一个(更复杂)版本:
app.use = function(middleware){
middlewareChain.push(middleware);
}
当请求到达时,express将贯穿中间件链,从开始到结束。使用当前的req
、res
和next
调用第一个定义的中间件,其中next
是链中的下一个中间件
在链的末尾,next
只是一个空函数。希望到那时,您已经用res
对象做了一些事情(比如res.send
)
(2) 被匿名函数包围,因此您可以将调用中的选项传递给应用程序。请使用。例如,connect的CookieSparser接受cookieSecret
。如果您正在开发没有选项的中间件,可以使用arity(req,res,next)
定义它并跳过返回函数。在这种情况下,您只需编写app.use(myMiddleware)
记住函数是JS中的对象,因此它们可以像任何其他对象一样传递和返回
当您告诉express使用您的中间件时,您正在调用myMiddleWare
函数:
app.use(myMiddleWare());
此调用返回标记为\\2.
的anon函数。然后,Express.js将在处理请求时将其作为中间件堆栈的一部分进行调用,并为其提供req
、res
和next
参数
通过检查arguments
对象,您总能看到哪些参数被传递给函数。(即console.log(参数)
) 非常感谢您在freenode#node.js上的额外演讲!