5

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

看看下面的工作设置,它只是将 do it 函数附加到 req 对象,以便我们可以在任何路由中调用它,就像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;

应用程序.js:

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

欢迎任何加深我知识的建议:)

~马克

4

2 回答 2

6

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

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

app.use(myMiddleWare());

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

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

于 2013-08-20T10:57:04.127 回答
3

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

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

当一个请求到达时,express 贯穿中间件链,从头到尾。第一个定义的中间件被调用,当前reqres, 和next, 其中next是链中的下一个中间件。

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

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

ExpressJS 中间件文档

于 2013-08-20T10:50:36.150 回答