Node.js express.js中中间件功能的范围

Node.js express.js中中间件功能的范围,node.js,scope,express,connect,middleware,Node.js,Scope,Express,Connect,Middleware,我正在学习express.js/node.js,对javascript原型模型有很好但不是很好的理解。因此,我对express.js的路由机制中中间件的堆叠方式有点困惑 说我们有这个 由于andrestricto(role)返回一个中间件,它在路由链中执行——我明白了。然而: req、res、next参数在返回的函数中来自何处?我猜“链”某种程度上是在排队并分配参数,但这对于更深入的理解来说有点太模糊了 作为next参数引发的错误发生了什么?错误是否会破坏中间件链 如果我想将限制机制打包到一个单

我正在学习express.js/node.js,对javascript原型模型有很好但不是很好的理解。因此,我对express.js的路由机制中中间件的堆叠方式有点困惑

说我们有这个

由于andrestricto(role)返回一个中间件,它在路由链中执行——我明白了。然而:

  • req、res、next参数在返回的函数中来自何处?我猜“链”某种程度上是在排队并分配参数,但这对于更深入的理解来说有点太模糊了

  • 作为next参数引发的错误发生了什么?错误是否会破坏中间件链

  • 如果我想将限制机制打包到一个单独的文件/模块(比如安全框架),那该如何做呢

  • 如果有人能指出其基本思想,那就太酷了:)Express(实际上是Connect)的路由代码接受一个HTTP请求并开始将其传递给所有中间件函数,用请求附带的
    req
    res
    调用它们中的每一个,并添加一个
    next
    ,调用路由代码的一部分,该部分将控制传递给链中的下一个中间件函数

    2) 未引发任何错误(只有
    throw
    语句才能实际引发错误)。路由代码识别出中间件函数返回了一个
    错误
    对象,并对此进行了适当的处理

    3) 您只需将其放入导出
    andRestrict
    的模块中(如果它是模块中唯一外部可用的函数,那么您可以设置
    exports=andRestrict
    ,然后使用
    require('mymodule')
    调用它);否则,您将设置
    exports.andRestrict=
    并分两步调用它:
    mymodule=require('mymodule')
    ,以及
    mymodule.andRestrict
    稍后(例如,当将其作为中间件传递时))。
    req
    res
    来自Express JS的源代码,例如Node.JS
    http.createServer
    handler(在实际点击Express的处理程序之前,这两个变量都被修改了一点)。此时,Express保存所有路由的数组,并将
    req
    res
    next
    功能应用于每条路由
    next
    函数知道我们目前在哪个中间件上(由于一些作用域技巧),并这样调用它:
    next()
    带您到下一个处理程序

    2) 当引发错误时(实际上不是引发,而是传递给),
    next
    函数会将您带到错误处理程序,您可以使用
    app
    error
    方法定义该错误处理程序,例如(取自):

    引发
    error
    会断开一个中间件链,并将您带到错误处理程序链(如您所见,您也可以在错误处理程序中使用
    next

    3) 一点也不难:

    security.js

    module.exports = function(req, res, next) {
        console.log('Security middleware!');
        next();
    }
    
    app.get('/', require('./security'), ...);
    
    app.js

    module.exports = function(req, res, next) {
        console.log('Security middleware!');
        next();
    }
    
    app.get('/', require('./security'), ...);