我正在使用REST Web应用程序后端,并且在将中间件链接在一起时遇到了一些问题。
例如,每个请求必须经过的中间件堆栈就像[before1,service,after1],这里是中间件" before1"的代码,这是只是我用来测试的代码:
'use strict';
var express = require('express');
var router = express.Router();
router.use(function(request, response, next){
console.log('This is middleware BEFORE1');
var success = true
if (!success){
// Go the logging middleware underneath
next();
}
else{
// Go to the 'service' middleware
next('route');
}
})
router.use(function(request, response, next){
console.log('This is middleware LOGGING');
response.sendStatus(400);
response.end();
})
module.exports = router;
上面的代码简单地说是' before1'成功之后,应该直接打电话给服务'中间件,否则转到下面的日志记录中间件并结束请求。但我的问题是,我无法找到可以跳过日志记录中间件的方法,我搜索并发现next('route')
可以提供帮助,但它在这里没有用。我错过了什么?
提前致谢!
修改
或者更优选地,如果我可以在任何中间件中发出错误并使用错误处理程序中间件正确处理所有类型的错误,那么它是最好的。
我的顶级代码的骨架如下:
// An array of middleware to be executed asynchronously
operations = [before1, service, before2];
async.series(operations, function(err) {
if(err) {
// one of the functions passed back an error so handle it here
console.log('Handling error!!!!');
res.end();
// return next(err);
}
console.log('middleware get executed');
// no errors so pass control back to express
next();
});
但我不确定为了做到这一点,应该如何相应地更改我的中间件。
答案 0 :(得分:0)
next
是一个节点式回调,意为fn(err, ..)
,因此您的next('route')
只会调用错误处理程序。
您可以通过向路径提供一系列函数来直接实现您的系列,并使用快速错误处理程序作为catch all(请参阅http://expressjs.com/guide/error-handling.html)