我希望expressjs middlware始终执行。即使next()是否存在错误也是如此。
是否有可能?
例子
app.get('/',[middle1,middle2],doIt)
即使middle1错误执行下一个,Middle2也应始终执行。
注意:middle2应该始终在最后执行,并采用以前的中间件计算出的值。在Middle1和Middle2之间也有很多中间件。
如果middle1
已知它不使用任何从其调用next()的异步操作,则可以对其进行包装并对其进行尝试/捕获,以便在抛出该异常时,可以next()
代表它进行调用。
如果它确实使用异步操作,或者您不知道它是否将使用异步操作,那么只有在它异步抛出(在异步之前)时,您才能捕获它的异常,并且您将无法捕获它异步抛出的任何异常。对于异步行为,您能做的最好的事情就是在包装器中设置某种超时。如果next()
在一段时间内没有调用它(要么是因为它引发了异常,要么是由于其他原因而失败了),那么您可以在超时时间之后调用下一个。
包装非异步middle1
可能看起来像这样:
function wrap(fn) {
return function(req, res, next) {
var nextCalled = false;
try {
fn(req, res, function() {
nextCalled = true;
next();
});
} finally {
if (!nextCalled) {
next();
}
}
}
}
app.get('/',[wrap(middle1),middle2],doIt);
该wrap()
函数插入一个存根作为中间件函数。该螺柱会插入自己的next()
函数,以便可以判断是否调用了实际的中间件函数next()
。然后,它将异常处理程序包装在中间件函数周围,因此,如果它同步引发异常,则可以恢复。函数返回后,它会检查是否next()
被调用,如果没有,则调用它。
如前所述,这种方法仅在中间件功能是同步的时才有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句