ExpressJS Middleware req,res,下一个范围

das*_*cht 5 connect node.js express

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

看看下面的工作设置,它只是将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;
Run Code Online (Sandbox Code Playgroud)

app.js:

...
var myMiddleware =  require('./MiddlewareTest.js')
app.use(myMiddleware())
...
Run Code Online (Sandbox Code Playgroud)

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

〜马克

rad*_*rio 6

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

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

app.use(myMiddleWare());
Run Code Online (Sandbox Code Playgroud)

此调用返回您标记为的anon函数\\2..然后Express.js将称其为部分是中间件堆栈处理的请求时,给它req,resnext论据.

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