Tôi đang sử dụng Node 7.2.1 với tính năng mới async/await. Tôi cũng đang sử dụng Native ES6 Promises với mongoose như thế này -Node.js UnhandledPromiseRejectionWarning ngay cả sau khi bắt được nó
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
dòng mã của tôi là như thế này -
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);
}
};
Mã này hoạt động hoàn toàn tốt. Vấn đề phát sinh khi có một số lỗi được tạo ra. Vì vậy, tôi cố ý sửa đổi truy vấn mongoose của mình để MongoDB sẽ phát sinh lỗi.
Bây giờ MongoDB, như dự kiến sẽ ném một lỗi hoàn toàn bị mã của tôi bắt và trả lại cho khách hàng với mã lỗi 400.
Vấn đề là mặc dù lỗi (cố ý) đã bị bắt bởi tôi, Node.js vẫn mang lại cho tôi cảnh báo này -
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.
Như có thể thấy yêu cầu của tôi đã trở lại 400 trạng thái và nhật ký lỗi của tôi cũng đã được in từ khối catch của phương thức ban đầu nhưng Node.js vẫn đang nói rằng thông báo lỗi không được xử lý.
Tại sao lại nói điều này ngay cả sau khi lỗi tương tự đã bị bắt?
Update - Nhờ @dvlsg và @Bergi, lỗi này đã được cố định trong phiên bản 4.7.5
Tôi đoán sẽ là bởi vì bạn đang bắt nó với một try/catch thay vì .catch(). –
@KevinB nhưng không phải là làm thế nào async/await xử lý lỗi? –
liên quan: http://stackoverflow.com/questions/40500490/what-is-unhandled-promise-rejection –