Node.js из версии 7 имеет асинхронный / ожидающий синтаксический сахар для обработки обещаний, и теперь в моем коде довольно часто появляется следующее предупреждение:
(node:11057) UnhandledPromiseRejectionWarning: Unhandled promise
rejection (rejection id: 1): ReferenceError: Error: Can't set headers
after they are sent.
(node:11057) 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.
К сожалению, нет ссылки на линию, где отсутствует улов. Есть ли способ найти его, не проверяя каждый блок try / catch?
node.js
promise
async-await
warnings
unhandled-exception
user1658162
источник
источник
unhandledRejection
событие Node поможет? Смотрите документы . Ваш обратный вызов получаетError
объект и фактическоеPromise
, и я считаю, чтоError
объект может содержать трассировку стека.Can't set headers after they are sent.
вы должны дать подсказку, где в вашем коде это может происходить (т.е. где вы устанавливаете заголовки после того, как заголовки уже были отправлены - возможно, из-за сбоя в понимании асинхронного кода , но это предположение)Ответы:
прослушать
unhandledRejection
событие процесса.источник
error.stack
(или в приведенном выше примереreason.stack
) дает полную трассировку стека ошибки.app.js
файла узлов, и, к сожалению, ничего не регистрируется. Узелv10.13.0
.Правильный путь , чтобы показать полную трассировку стеки для необработанных отбраковок ES6 Promise, является запуск Node.js с
--trace-warnings
флагом. Это покажет полную трассировку стека для каждого предупреждения, без необходимости перехватывать отклонение из вашего собственного кода. Например:Убедитесь, что
trace-warnings
флаг стоит перед именем вашего.js
файла! В противном случае флаг будет интерпретирован как аргумент вашего скрипта и будет игнорироваться самим Node.js.Если вы действительно хотите обрабатывать необработанные отклонения (например, регистрируя их), то вы можете
unhandled-rejection
вместо этого использовать мой модуль, который перехватывает все необработанные отклонения для каждой крупной реализации Promises, которая его поддерживает, с помощью одного обработчика событий.Этот модуль поддерживает Bluebird, ES6 Promises, Q, WhenJS,
es6-promise
,then/promise
и что - нибудь , который соответствует любому из необработанной спецификации отбраковки (полные детали в документации).источник
package.json
запустить скрипт, и к сожалению ничего не было зарегистрировано. Узелv10.13.0
.Ведение журнала с трассировкой стека
Если вы ищете более полезное сообщение об ошибке. Попробуйте добавить это в ваш файл узла. Он должен отображать полную трассировку стека, где происходит ваш сбой.
источник