shr*_*ing 9 scope middleware connect node.js express
我正在学习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);
});
Run Code Online (Sandbox Code Playgroud)
由于andRestrictTo(role)返回一个中间件,它在路由链中执行 - 我得到了.然而:
req,res,next参数在返回的函数中来自哪里?我猜这个"链"以某种方式排队并对参数进行排序,但这对于更深入的理解来说有点过于模糊......
作为next参数引发的Error会发生什么?错误是否会破坏中间件链?
如果我想将限制机制打包到一个单独的文件/模块(如安全框架),那该怎么办呢?
如果有人可以指出基本的想法,这将是很酷的:)
1)req和res来自快速JS,即Node.js的的源头http.createServer处理程序(这两个变量被修改实际上是打快处理程序之前一点).此时Express保存所有路由的数组并应用req,res并对next每条路径起作用.next函数知道我们目前在哪个中间件(由于一些作用域技巧)并像这样调用它:next()带你到下一个处理程序.
2)当引发错误(实际上没有引发但传递给)时,该next函数会将您带到错误处理程序,您可以使用该error方法定义错误处理程序app(例如,从Express文档中获取):
app.error(function(err, req, res, next){
if (err instanceof NotFound) {
res.render('404.jade');
} else {
next(err);
}
});
Run Code Online (Sandbox Code Playgroud)
提升error打破了一系列中间件并带您进入错误处理程序链(正如您所看到的,您也可以使用next错误处理程序).
3)一点都不困难:
security.js
module.exports = function(req, res, next) {
console.log('Security middleware!');
next();
}
Run Code Online (Sandbox Code Playgroud)
app.js
app.get('/', require('./security'), ...);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4504 次 |
| 最近记录: |