Node.js od wersji 7 ma cukier składniowy async / await do obsługi obietnic, a teraz w moim kodzie dość często pojawia się następujące ostrzeżenie:
(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.
Niestety nie ma odniesienia do wiersza, w którym brakuje haczyka. Czy jest sposób, aby go znaleźć bez sprawdzania każdego bloku try / catch?
node.js
promise
async-await
warnings
unhandled-exception
user1658162
źródło
źródło
unhandledRejection
pomoże Ci rejestracja na wydarzenie Node ? Zobacz dokumentację . Twoje wywołanie zwrotne pobieraError
obiekt i rzeczywistyPromise
, i uważam, żeError
obiekt może zawierać ślad stosu.Can't set headers after they are sent.
powinien dać ci wskazówkę, gdzie w twoim kodzie może się to dziać (tj. Gdzieś ustawiasz nagłówki po tym, jak nagłówki zostałyby już wysłane - prawdopodobnie z powodu braku zrozumienia kodu asynchronicznego , ale to przypuszczenie)Odpowiedzi:
słuchać
unhandledRejection
zdarzenia procesu.źródło
error.stack
(lub w powyższym przykładziereason.stack
) daje pełny ślad stosu błędu.process.on
a nieserver.on
jak w wielu innych przykładach, które znalazłemapp.js
pliku węzłów i niestety nic nie jest rejestrowane. Nodev10.13.0
.Poprawny sposób, aby pokazać pełny StackTrace dla nieobsługiwany odrzucenia ES6 obietnica jest uruchomienie node.js z
--trace-warnings
flagą. Spowoduje to wyświetlenie pełnego śladu stosu dla każdego ostrzeżenia, bez konieczności przechwytywania odrzucenia z własnego kodu. Na przykład:Upewnij się, że
trace-warnings
flaga znajduje się przed nazwą.js
pliku! W przeciwnym razie flaga zostanie zinterpretowana jako argument twojego skryptu i zostanie zignorowana przez sam Node.js.Jeśli chcesz faktycznie obsłużyć nieobsłużone odrzuty (np. Przez rejestrowanie ich), możesz
unhandled-rejection
zamiast tego użyć mojego modułu, który przechwytuje wszystkie nieobsłużone odrzuty dla każdej głównej implementacji Promises, która go obsługuje, z pojedynczą obsługą zdarzenia.Tego modułu podpory Bluebird obiecuje ES6, Q, WhenJS,
es6-promise
,then/promise
, i nic, które odpowiada żadnej z nieobsłużonych specyfikacji odrzuceniu (pełne szczegóły w dokumentacji).źródło
package.json
uruchomić skrypt i niestety nic nie zostało zapisane. Nodev10.13.0
.Rejestrowanie za pomocą śladu stosu
Jeśli szukasz bardziej pomocnego komunikatu o błędzie. Spróbuj dodać to do pliku węzłów. Powinien wyświetlić pełny ślad stosu, w którym ma miejsce twoja awaria.
źródło