呼叫' next()'从中间件中的承诺导致下一个不应该被调用不止一次'

时间:2018-02-02 20:56:23

标签: javascript node.js express promise restify

最近我将代码从Express更改为Restify。我老实说不确定以前是否曾经发生过,但我猜它确实发生了。

基本上在我的中间件中,我调用了一个promisified方法,当它解析时,我调用next并在下一个中间件中执行其他操作。当它被拒绝时,我也想在某些情况下调用next而没有错误。否则,它必须调用将err传递给next的错误中间件。

somePromise()
.then(()=>{
    next();
})
.catch((err)=>{
    if(err.someatt) next();
    else next(err)
});

它与somePromise的预期结果一起正常工作。问题是nextthen-catch链的约束。当下一个中间件发生错误时,它会调用catch方法并再次调用next

我发现接下来有一个属性called,当我再次调用它之前将其转为false时,我摆脱了错误。但当然这是一个反模式。我在不同的中间件中也遇到了同样的问题,我也使用了promises(按预期调用next,然后在catch语句中再次调用它。)

其他人有这样的问题吗?

1 个答案:

答案 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)之间的区别:

promise then promise then-catch