Javascript 在nested then和ExpressJS/NodeJs中返回错误

Javascript 在nested then和ExpressJS/NodeJs中返回错误,javascript,node.js,express,promise,sequelize.js,Javascript,Node.js,Express,Promise,Sequelize.js,我对函数调用返回错误有点困惑。 例如,我使用sequelizeJS来说明这一点。 通常: 先按Ctrl键 var second_ctrl = require( '../ctrl/second'); testCode : function(req, res, next){ return second_ctrl.getData() .then(function(resultData){ res.json(resultData);

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

先按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)
          })
}
getData : function(){
    return models.Data.findAll()              
}
Second.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)
          })
}
getData : function(){
    return models.Data.findAll()              
}
getData findAll中的任何错误都将转到first_ctrl的catch块。但是如果我必须做一些操作,比如:

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 error、return error和删除内部catch块,但在这两种情况下,执行都会在resultData接收到error对象的情况下首先进入then block

对于这种情况,什么是最佳实践,因为这些嵌套调用可以更深入(第一次\u ctrl->第二次\u ctrl->第三次\u ctrl)


让我知道。期待你的想法

目前还不是一个完整的答案,但希望它能帮助你走上正轨

你的核心思想是正确的。以下代码工作:

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块中没有注意到它(您在那里以及在您的外部catch块中调用res.json(),那么您如何知道调用的是哪一个呢)
  • 你正在使用一个被窃听的promise库

希望这至少有一点帮助。

你确定你投掷时落在了then挡块中吗?预期的行为与您的示例类似,您应该在外部捕捉块中结束(如果您希望始终在外部块中捕捉,您甚至不需要内部捕捉块)。即使我尝试删除内部捕捉块,但我在first_ctrl的then块中结束。@adeneo:正如我所知道的承诺,我必须使用像q或bluebird这样的promise库。如果没有这些,这是不可能的。如果可能的话,请让我知道我可以通过一个片段。我想我不太明白。抛出一个错误,并在第一个catch块中结束,但不会在第二个chained catch块中结束,因为该链已恢复。在catch块中抛出应该尽我所能工作。我没有使用任何promise库,也没有在second_ctrl中创建任何promise对象。正如上面提到的那样。我想这就是原因吧?我必须使用promise图书馆。对吗?models.Data.findAll()返回的不是承诺,而是什么?它肯定会返回一些thenable,否则您的then块也不会被调用