express.js中的中间件function的范围
我正在学习express.js / node.js,并对JavaScript原型模型有一个很好但不是很好的理解。 因此,我对中间件可以用express.js的路由机制进行堆叠的方式感到困惑。
说我们有这个代码
function andRestrictTo(role) { return function(req, res, next) { req.authenticatedUser.role == role ? next() : next(new Error('Unauthorized')); } } app.del('/user/:id', loadUser, andRestrictTo('admin'), function(req, res){ res.send('Deleted user ' + req.user.name); });
由于和RestrictTo(angular色)返回一个中间件,它得到在路由链中执行 – 我明白了。 然而:
-
req,res,next参数在返回函数中来自哪里? 我想这个“连锁店”是排队的,并且对参数进行了调整,但是对于更深入的理解,这有些太模糊了。
-
作为下一个参数引发的错误发生了什么? 错误是否会破坏中间件链?
-
如果我想将限制机制打包到一个单独的文件/模块(如安全框架),那将如何完成?
这将是很酷,如果有人可以指出基本的想法:)
1) req
和res
来自Express JS的源头,即Node.JS http.createServer
处理程序(在实际点击Express'处理程序之前,这两个variables都被修改了一下)。 在这点上,Express保存了所有路由的数组,并将req
, res
和next
函数应用到每个路由。 next
函数知道我们在哪个中间件(由于一些作用域技巧),并像这样调用它: next()
将您带到下一个处理程序。
2)当错误发生时(实际上没有发生,但传递给), next
函数将把你带到error handling程序,你可以使用app
error
方法来定义error handlingapp
,例如(取自Express文档 ):
app.error(function(err, req, res, next){ if (err instanceof NotFound) { res.render('404.jade'); } else { next(err); } });
提高error
中断一系列中间件,并将您带到error handling程序链中(如您所见,您也可以在error handling程序中使用next
error handling程序)。
3)不难:
security.js
module.exports = function(req, res, next) { console.log('Security middleware!'); next(); }
app.js
app.get('/', require('./security'), ...);
1)Express的(实际上是Connect的)路由代码接受一个HTTP请求,并开始把它传递给所有的中间件函数,用请求附带的req
和res
调用每个函数,然后添加一个调用这个请求的部分路由代码将控制权传递给链中的下一个中间件function。
2)没有错误发生(只有一个throw
语句实际上可以引发一个错误)。 路由代码认识到一个中间件函数已经返回了一个Error
对象,并且适当地处理它。
3)你只要把它放到一个导出和andRestrict
的模块中(如果它是模块中唯一的外部可用函数,你可以设置exports=andRestrict
和exports=andRestrict
,然后用require('mymodule')
)调用它。 否则你会设置exports.andRestrict=<body of your function>
并分两步调用它: mymodule=require('mymodule')
, mymodule.andRestrict
稍后(例如当它作为中间件传递时))。