Node.js ExpressJS中间件请求,res,下一个作用域

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) { //

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

看看下面的工作设置,它只是将doit函数附加到req对象,这样我们就可以在任何路由中调用它,就像
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上的额外演讲!