Tìm nguồn từ chối lời hứa chưa được xử lý: TypeError: Phát hiện chu kỳ chuỗi


11

Tôi đang cố gắng tìm ra nguồn từ chối chưa được xử lý từ Lời hứa trong Node.js

Tôi đã thử nâng cấp lên Node phiên bản 12, sử dụng --async-stack-tracestùy chọn và lắng nghe họ bằng cách sử dụng:

process.on("unhandledRejection",( reason, promise ) => {
  console.log(reason);
  console.log(promise);
});

Nhưng tôi vẫn không thấy bất kỳ dấu vết ngăn xếp hữu ích nào để giúp tôi tìm ra thủ phạm!

UnhandledPromiseRejectionWarning: TypeError: Chaining cycle detected for promise #<Promise>
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:89675) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 11)

Chạy nút v10.10.0


Có nhiều lời hứa không?
Bohhjot Singh Kainth

4
Lỗi trong mã của bạn là một chuỗi tuần hoàn, giống như bạn mắc phải const cyclic = Promise.resolve().then(()=>cyclic);, vì vậy đừng tìm kiếm từ chối lời hứa chưa được xử lý, lỗi này nằm trong mã nội bộ của nút.
Kaiido

1
Một số mã tăng vấn đề sẽ hữu ích.
x00

chạy npm i bluebirdvà thêm const Promise = require('bluebird')mã có thể cung cấp cho bạn thông báo lỗi chi tiết hơn
n3ko

hãy thử chạy nút với các --trace-warningstừ chối chưa được xử lý đi kèm với các cảnh báo mà bạn có thể theo dõi
Karen Grigoryan

Câu trả lời:


2

Nếu bạn bỏ lỡ một stacktrace hữu ích, bạn có thể tạo nút tạo một nút mới bằng cách ném lại lỗi của bạn trong trình xử lý của bạn như thế này:

process.on('unhandledRejection', (reason, p) => { throw reason });

Bằng cách này, bạn sẽ có thể theo dõi thủ phạm.


Tôi chỉ thử lại về phía mình, và nó chắc chắn hoạt động.
Gomino

@d -_- b bạn đã có thể kiểm tra điều này về phía bạn chưa?
Gomino

Xin chào @Gomino, vâng, thật không may, nó không hoạt động trong kịch bản của tôi nhưng tôi đánh giá cao sự giúp đỡ của bạn ở đây!
d -_- b

0

Cảm ơn tất cả những lời đề nghị. Tôi đã thử một lần nữa bằng cách nâng cấp lên Node mới nhất 12.14.1và cuối cùng đã có thể lấy nó để hiển thị dấu vết ngăn xếp:

Tôi đã sử dụng node --async-stack-traces myScript.jskết hợp với:

process.on('unhandledRejection', (reason, p) => {
  console.log(reason);
});

Và nó đã theo dõi lỗi.


Không nút 12 nào ghi lại lý do từ chối chưa được xử lý ngay cả khi không có trình xử lý sự kiện đó?
Bergi

Bạn thậm chí không thử giải pháp tôi đã cung cấp?
Gomino

-1

Để tìm một số dấu vết ngăn xếp tốt cho mã này, const cyclic = Promise.resolve().then(() => cyclic); tôi đặt mã này vào tệp prromise_cycle.jsvà chạy với trình kiểm tra để gỡ lỗi.

Tôi gỡ lỗi nó trên Chrome DevTools với cờ Pause on caught exceptionsđược bật và sau đó tôi có thể thấy toàn bộ dấu vết ngăn xếp với tệp của mình trên đó

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.