Node.js dari versi 7 memiliki gula sintaksis async / menunggu untuk menangani janji dan sekarang dalam kode saya peringatan berikut muncul cukup sering:
(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.
Sayangnya tidak ada referensi ke garis di mana hasil tangkapan hilang. Apakah ada cara untuk menemukannya tanpa memeriksa setiap blok coba / tangkap?
node.js
promise
async-await
warnings
unhandled-exception
pengguna1658162
sumber
sumber
unhandledRejection
acara Node akan membantu? Lihat dokumen . Callback Anda mendapatkanError
objek dan aktualPromise
, dan saya percayaError
objek mungkin menyimpan jejak jejak.Can't set headers after they are sent.
harus memberi Anda petunjuk di mana dalam kode Anda itu bisa terjadi (yaitu di suatu tempat Anda menetapkan header setelah header sudah dikirim - mungkin karena kegagalan dalam memahami kode asinkron , tapi itu dugaan)Jawaban:
dengarkan
unhandledRejection
acara proses.sumber
error.stack
(atau dalam contoh di atasreason.stack
) memberi Anda jejak stack penuh kesalahan.process.on
daripadaserver.on
suka dalam banyak contoh lain yang saya temukanapp.js
file simpul saya dan sayangnya tidak ada yang dicatat. Nodev10.13.0
.Cara yang benar untuk menunjukkan stacktrace penuh untuk penolakan ES6 Promise yang tidak tertangani, adalah menjalankan Node.js dengan
--trace-warnings
bendera. Ini akan menampilkan stacktrace penuh untuk setiap peringatan, tanpa harus mencegat penolakan dari dalam kode Anda sendiri. Sebagai contoh:Pastikan
trace-warnings
bendera datang sebelum nama.js
file Anda ! Jika tidak, bendera akan ditafsirkan sebagai argumen untuk skrip Anda, dan itu akan diabaikan oleh Node.js sendiri.Jika Anda ingin benar-benar menangani penolakan yang tidak ditangani (mis. Dengan mencatatnya), maka Anda mungkin ingin menggunakan
unhandled-rejection
modul saya sebagai gantinya, yang menangkap semua penolakan yang tidak ditangani untuk setiap implementasi Janji utama yang mendukungnya, dengan pengatur kejadian tunggal.Modul yang mendukung Bluebird, ES6 Promises, Q, WhenJS,
es6-promise
,then/promise
, dan apa yang paling sesuai dengan salah satu spesifikasi penolakan tertangani (rincian lengkap dalam dokumentasi).sumber
package.json
memulai skrip dan sayangnya tidak ada yang dicatat. Nodev10.13.0
.Logging dengan stack stack
Jika Anda mencari lebih banyak pesan kesalahan bermanfaat. Coba tambahkan ini ke file simpul Anda. Seharusnya menampilkan jejak tumpukan penuh di mana kecelakaan Anda terjadi.
sumber