Поиск источника необработанного отклонения обещания: TypeError: Цикл цепочки обнаружен для обещания


11

Я пытаюсь найти источник необработанного отказа от Promise в Node.js

Я попытался обновить до Node версии 12, используя --async-stack-tracesопцию, и прослушал их, используя:

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

Но я все еще не вижу никакой полезной трассировки стека, чтобы помочь мне найти виновника!

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)

Работающий узел v10.10.0


Есть многократные обещания?
Прабхджот Сингх Каинт

4
Ошибка в вашем коде - это циклическая цепочка, как у вас const cyclic = Promise.resolve().then(()=>cyclic);, поэтому не ищите необработанное отклонение обещания, это во внутреннем коде узла.
Кайидо

1
Некоторый код, поднимающий проблему, был бы полезен.
x00

запуск npm i bluebirdи добавление const Promise = require('bluebird')в код может дать вам более подробное сообщение об ошибке
n3ko

попробуйте запустить узел с --trace-warnings, необработанные отклонения сопровождаются предупреждениями, которые вы можете отследить
Карен Григорян

Ответы:


2

Если вы пропустили полезную трассировку стека, вы можете заставить узел создать новый, повторно выдав свою ошибку в ваш обработчик следующим образом:

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

Таким образом, вы сможете найти виновного.


Я просто пытаюсь снова на моей стороне, и это определенно работает.
Гомино

@d -_- b ты смог проверить это на своей стороне?
Гомино

Привет @Gomino, да, к сожалению, это не сработало в моем сценарии, но я ценю вашу помощь здесь!
d -_- б

0

спасибо за все предложения. Я попытался еще раз, обновившись до последней версии Node, 12.14.1и наконец смог заставить его показать трассировку стека:

Я использовал node --async-stack-traces myScript.jsв сочетании с:

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

И это выследило ошибку.


Разве узел 12 не регистрирует необработанную причину отклонения даже без этого обработчика событий?
Берги

Разве вы не пробовали решение, которое я предоставил?
Гомино

-1

Чтобы найти хорошую трассировку стека для этого кода, const cyclic = Promise.resolve().then(() => cyclic); я поместил этот код в файл prromise_cycle.jsи запустил инспектор для его отладки.

Я отлаживаю его в Chrome DevTools с Pause on caught exceptionsвключенным флагом , а затем вижу всю трассировку стека с моим файлом на нем

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.