【发布时间】:2015-11-08 22:29:31
【问题描述】:
在我的承诺堆栈深处,我做了这个调用:
function isNameAvailable(name) {
return registry.getName(name)
.then(function(result) {
return result ? false : true;
});
}
很遗憾,这是一个编程错误,注册表未定义。我的 node.js 应用程序没有打印任何错误消息。任何想法为什么?我正在使用 bluebird promise 库。
编辑
这是调用代码。我刚刚添加了捕获,但它没有捕获任何内容。
function _checkAvailability(name) {
return isNameAvailable(name)
.then(function(isAvailabile) {
if (isAvailabile) {
return true;
}
else {
throw new NameNotAvailable('Name "' + name + '" is not available');
}
})
.catch(function(error) {
console.log('isNameAvailable threw', error);
throw error;
})
}
堆栈最终应该回滚到 express.js 作为 HTTP 请求的结果调用的函数。这是我捕获所有错误并打印堆栈跟踪的地方(但显然它没有打印任何内容):
function createUser(req, res) {
userService.createUser(req.body)
.then(function(user) {
res.status(201).send(user);
})
.catch(function(error) {
log.trace(error);
res.status(500).send({'message': error.toString()});
});
}
【问题讨论】:
-
你在哪里打电话给
isNameAvailable?它确实抛出了。 -
你能分享更多你的代码吗?据此,我猜问题在于您没有发现错误。
-
请查看我对此代码调用者的编辑。
-
isNameAvailable同步执行throw异常。这不会在返回值的任何.catch()处理程序中被捕获,因为您没有返回被拒绝的承诺——catch方法永远不会执行。如果您正在执行类似somePromise.then(isNameAvailable)(或.then(_checkAvailability))之类的操作,该错误将被捕获并转化为拒绝 -
好的,有道理。所以基本问题是
isNameAvailable由于编程错误 没有返回承诺,所以我们不能指望then和catch工作。看来我根本不应该更改代码,而只是确保我能够调试此类问题。
标签: javascript node.js bluebird