gpt4 book ai didi

node.js - 未捕获从 mongoose-promise 回调函数抛出的错误

转载 作者:搜寻专家 更新时间:2023-10-31 22:38:27 25 4
gpt4 key购买 nike

我花了太多时间试图弄清楚为什么我的 express.js Controller 没有响应一个简单的查询,并且发现从 Mongoose-promise 回调中引发的运行时错误正在默默地中断回调过程。

这是我的代码的简化版本:

server.get('/api/test', function (req, res, next) {
User.find({}).exec().then(function success(users){
console.log('SUCCESS');
typo[0] = 1; // throws a runtime error
res.json(users);
}, function error(err){
console.log('ERROR');
res.json({error: err});
});
});

这导致 SUCCESS 出现在我的控制台中,但随后什么也没有发生。没有给用户任何响应,我的拼写错误导致的错误没有出现在我的控制台中,也没有调用错误回调。

我知道不应该从回调函数中抛出异常,但在那种情况下,这只是一个拼写错误,对我来说,无论何时发出警告(例如,我的标准输出中的堆栈跟踪)都是有意义的犯这种错误。 (毕竟我们是人类……)

在您看来,每当在 promise 回调中出现此类错误时,获得反馈的最佳方式是什么?

最佳答案

这是 Mongoose 的错,因为它使用了错误的 promise 实现。 Promise 是抛出安全的,因此异常会被捕获(因此它们可以在以后由 future 的代码处理)—— future 的代码永远不会到来,Mongoose 也不会报告它没有发生。良好的 promise 实现不会遇到这个问题。

你有两个选择:

使用像 Bluebird 这样的库:

var Promise = require("bluebird");
var mongoose = Promise.promisifyAll(require("mongoose"));

User.findAsync({}).then(function(data){
JSON.prase("dsa"); // not a silent failure, will show up, easy debugging
});

这具有比 Mongoose promise 更快的优势,因此没有性能损失。或者,如果您非常保守并且不想要 bluebird 的性能和 API 增益 - 您可以使用原生 promise :

// Promise is the native promise
Promise.resolve(User.find({}).exec()).then(function(data){
JSON.prase("dsa");
});

然后,假设您正在运行 nodejs 的现代变体(阅读:io.js v 1.4.1 或更高版本),您可以订阅 promise 拒绝:

process.on("unhandledRejection", function(p, why){
console.log("FOUND ERROR!!!!", p , why);
});

所以异常不会被默默地抑制。

关于node.js - 未捕获从 mongoose-promise 回调函数抛出的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29794064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com