Javascript 在nested then和ExpressJS/NodeJs中返回错误
我对函数调用返回错误有点困惑。 例如,我使用sequelizeJS来说明这一点。 通常: 先按Ctrl键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);
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块也不会被调用