最近我将代码从Express更改为Restify。我老实说不确定以前是否曾经发生过,但我猜它确实发生了。
基本上在我的中间件中,我调用了一个promisified方法,当它解析时,我调用next
并在下一个中间件中执行其他操作。当它被拒绝时,我也想在某些情况下调用next
而没有错误。否则,它必须调用将err
传递给next
的错误中间件。
somePromise()
.then(()=>{
next();
})
.catch((err)=>{
if(err.someatt) next();
else next(err)
});
它与somePromise
的预期结果一起正常工作。问题是next
受then-catch
链的约束。当下一个中间件发生错误时,它会调用catch
方法并再次调用next
!
我发现接下来有一个属性called
,当我再次调用它之前将其转为false时,我摆脱了错误。但当然这是一个反模式。我在不同的中间件中也遇到了同样的问题,我也使用了promises(按预期调用next
,然后在catch
语句中再次调用它。)
其他人有这样的问题吗?
答案 0 :(得分:4)
将您的链变为:
somePromise().then(() => {
next();
}, err => {
// error occurred in somePromise()
if(err.someatt) next();
else next(err);
}).catch(err => {
// error occurred in .then()'s next()
// don't call next() again
});
.then()
的可选第二个参数充当.catch()
回调,但仅针对链中较高的错误调用,并且不会针对相邻{{1}中抛出的错误调用回调。
借鉴this awesome answer的非常有用的流程图演示了.then()
和.then(onFulfilled, onRejected)
之间的区别: