【发布时间】:2017-05-05 22:42:49
【问题描述】:
我正在使用具有新 async/await 功能的 Node 7.2.1。我也在像这样使用带有猫鼬的 Native ES6 Promises -
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
我的代码流程是这样的——
async function getFollowers(){
try {
const followers = await User.getFollowersFromMongo(req.params.userId);
res.send(followers);
} catch (err) {
winston.error('Printing Error = ', err);
res.status(400).send({success: false, error: err});
}
}
UserSchema.statics.getFollowersFromMongo = async(userId) => {
try {
let aggregateQuery = []; //some syntactical error in mongo query to produce exception
const followers = await User.aggregate(aggregateQuery);
return followers.map(follower => follower.followerData);
}
catch (err) {
return Promise.reject(err);
}
};
这段代码工作得很好。当产生一些错误时就会出现问题。所以我特意修改了我的 mongoose 查询,以便 MongoDB 会抛出错误。
现在 MongoDB 正如预期的那样抛出一个错误,该错误被我的代码完全捕获并返回给客户端并返回 400 错误代码。
问题是即使错误(故意)已被我发现,Node.js 仍然给我这个警告 -
error: Printing Error = MongoError: path option to $unwind stage should be prefixed with a '$': followerData
at Function.MongoError.create (/home/node_modules/mongodb-core/lib/error.js:31:11)
at /home/node_modules/mongodb-core/lib/connection/pool.js:483:72
at authenticateStragglers (/home/node_modules/mongodb-core/lib/connection/pool.js:429:16)
at Connection.messageHandler (/home/node_modules/mongodb-core/lib/connection/pool.js:463:5)
at Socket.<anonymous> (/home/node_modules/mongodb-core/lib/connection/connection.js:317:22)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at TCP.onread (net.js:551:20)
GET /user/385/followers 400 39.868 ms - 263
(node:10158) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): MongoError: path option to $unwind stage should be prefixed with a '$': followerData
(node:10158) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
可以看出我的请求返回了 400 状态,并且我的错误日志也从初始方法的 catch 块中打印出来,但是 Node.js 仍然说错误消息没有被处理.
为什么即使在相同的错误被捕获后还是这样说?
更新 - 感谢@dvlsg 和@Bergi,该错误已在版本 4.7.5 中得到修复
【问题讨论】:
-
我猜是因为你用 try/catch 而不是 .catch() 来捕捉它。
-
@KevinB 但这不是 async/await 处理错误的方式吗?
-
不使用
.catch()似乎不是问题。 This 是另一个使用相同方法的示例,它不会产生unhandled堆栈跟踪。 -
此示例没有未处理错误的原因是因为
caller1将catch来自Promise.reject(err)来自caller2。
标签: javascript node.js mongoose async-await es6-promise