在嵌套的then和promises ExpressJS / NodeJs中返回错误

时间:2016-10-12 19:48:37

标签: javascript node.js express promise sequelize.js

我对从函数调用返回错误感到困惑。 例如,我使用sequelizeJS来说明这一点。 通常:

First.Ctrl

var second_ctrl = require( '../ctrl/second');
testCode : function(req, res, next){
    return second_ctrl.getData()
          .then(function(resultData){
                res.json(resultData);
          })
          .catch(function(error){
                res.json(error)
          })
}

Second.Ctrl

getData : function(){
    return models.Data.findAll()              
}

getData findAll中的任何错误都会捕获first_ctrl的块。但是,如果我必须做一些操作,如:

Second.Ctrl - 操作

getData : function(){
    return models.Data.findAll()
          .then(function(result){
                if(result == null)
                   throw new Error ('No data found');
                return  result;
          })
          .catch(function(error){
                throw error;
                //return error
          })
}

我尝试过使用throw错误,返回错误并删除内部catch块,但在两种情况下 - 执行都会在first_ctrl中阻塞,而resultData已经收到了错误对象。

这种情况的最佳做法是什么,因为这些嵌套调用可以更深入(first_ctrl - > second_ctrl - > third_ctrl)

让我知道。期待您的想法

1 个答案:

答案 0 :(得分:1)

尚未完整答案,但希望能帮助您走上正轨。

你的核心理念是对的。以下代码有效:

const myPromise = Promise.reject(new Error('some error'))
  .then(res => console.log('inner then'))
  .catch(err => {
    console.log('inner err');
    throw err
  })
  .then(res => console.log('outer then'))
  .catch(err => console.log('outer err'));
// logs:
//   inner err
//   outer err

因此,我可以想象的事情可能是我们问题的原因:

  • 你在外面的catch区块中没有注意到它(你在那里和外面调用res.json() - 你怎么知道哪一个被调用)
  • 您正在使用带错误的承诺库。

希望这有助于至少一点。