Khi chạy mã sau, tôi nhận được các kết quả khác nhau tùy thuộc vào việc tôi có console.log("fnError: ", fnError)
nhận xét hay không. Điều này có vẻ rất với tôi.Lỗi NodeJS với promise.catch và console.log?
Làm thế nào trên thế giới là cuộc gọi đến console.log
ảnh hưởng đến lời hứa của tôi?
function run() {
var fn = function(){
throw new Error("incorrect message");
};
// returns a promise that should fail with
// an error object whose .message is "correct message"
var promisifiedFn = function(){
return Promise.resolve()
.then(fn)
.catch((fnError) => {
// commenting this out fixes things! //
console.log("fnError: ", fnError);
///////////////////////////////////////
fnError.message = "correct message";
throw fnError;
})
}
promisifiedFn().catch((e) => {
console.log("caught error.message:", e.message);
console.log("caught error:", e);
});
}
run();
Trên đây sản xuất:
// fnError: Error: incorrect message
// at fn (/Users/sam/dev/ethereum/pennyeth/js/temp.js:18:9)
// at <anonymous>
// at process._tickCallback (internal/process/next_tick.js:169:7)
// ...
// caught error.message: correct message
// caught error: Error: incorrect message
// at fn (/Users/sam/dev/ethereum/pennyeth/js/temp.js:18:9)
// at <anonymous>
// at process._tickCallback (internal/process/next_tick.js:169:7)
// ...
Thông báo "tin nhắn không chính xác" đang được đăng nhập. Và nếu bạn nhận xét ra console.log("fnError: ", fnError)
bạn có được điều này:
// caught error.message: correct message
// caught error: Error: correct message
// at fn (/Users/sam/dev/ethereum/pennyeth/js/temp.js:18:9)
// at <anonymous>
// at process._tickCallback (internal/process/next_tick.js:169:7)
// ....
Chạy nút 8.0.0
Lưu ý: Trong mã ứng dụng thực tế của tôi, tôi _không ghi nhật ký lỗi trước khi thực hiện lại và tôi vẫn nhận được hành vi này. Thật không may tôi không thể tìm ra một ví dụ tối thiểu của nó. –
Điều này thật lạ lùng. Tôi đã thử nó Chrome 59 và nó không có cùng một vấn đề. Nhưng Node 7.9.0, Node 8.0.0 và Node 8.1.2 đều có hành vi này (hoặc lỗi). – styfle
suy nghĩ duy nhất của tôi là console.log là bộ nhớ đệm đối tượng lỗi trước khi giảm dần để stdout. Lưu ý rằng cả hai kết quả "message không chính xác" đều ghi lại cùng một đối tượng. – styfle