Node.js UnhandledPromiseRejectionWarning में कौन से वादे अनहोनी हैं, कैसे पता करें?


177

वर्जन 7 से Node.js में वादे को संभालने के लिए async / प्रतीक्षारत शर्करा है और अब मेरे कोड में निम्नलिखित चेतावनी काफी महत्वपूर्ण है:

(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.

दुर्भाग्य से उस लाइन का कोई संदर्भ नहीं है जहां कैच छूटा हो। क्या हर कोशिश / कैच ब्लॉक को चेक किए बिना इसे खोजने का कोई तरीका है?


आप ब्लूबर्ड वादा पुस्तकालय का उपयोग कर सकते हैं और यह संभवतः आपको एक स्टैक ट्रेस देगा।
jfriend00

3
शायद नोड की unhandledRejectionघटना में पंजीकरण करने से मदद मिलेगी? डॉक्स देखें । आपके कॉलबैक को Errorऑब्जेक्ट और वास्तविक मिलता है Promise, और मुझे विश्वास है कि Errorऑब्जेक्ट स्टैक ट्रेस पकड़ सकता है।
YSK

यदि पिछली दो टिप्पणियां मदद नहीं करती हैं, तो Can't set headers after they are sent.आपको एक सुराग देना चाहिए कि आपके कोड में यह कहां हो रहा है (यानी कहीं आप हेडर के बाद हेडर सेट कर रहे हैं जो पहले ही भेज दिया गया होगा - संभवतः अतुल्यकालिक कोड को समझने में विफल होने के कारण , लेकिन यह एक अनुमान है)
जारोमांडा एक्स

नमस्ते कि संदेश यह सुनिश्चित करने में मदद करते हैं कि कोड कहां है, बग को पता है कि यह लाइन को जानना उतना आसान नहीं है।
user1658162

1
@ jfriend00 यह पता चला है कि यह एक ऐसी स्थिति थी जहां एक async फ़ंक्शन एक त्रुटि फेंक रहा था - उन आंतरिक नोड्स के लिए async फ़ंक्शंस ब्लूबर्ड का उपयोग नहीं करते हैं, कभी भी, इसलिए ब्लूबर्ड होने से उस परिदृश्य में मदद नहीं मिलती है।
एडम रीस

जवाबों:


297

unhandledRejectionप्रक्रिया की घटना सुनें ।

process.on('unhandledRejection', (reason, p) => {
  console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
  // application specific logging, throwing an error, or other logic here
});

35
लॉगिंग error.stack(या उपरोक्त उदाहरण में reason.stack) आपको त्रुटि का पूर्ण स्टैक ट्रेस देता है।
एडम रीस

इतने सारे अन्य उदाहरणों के process.onबजाय server.onजैसे मैंने पाया है , इसके लिए धन्यवाद
PhillipHolmes

9
काश, मैं कह सकता कि यह काम किया है, लेकिन यह नहीं है। मैं Node 8.9.4 पर हूं।
ffxsam

2
मैंने उपरोक्त कोड की कोशिश की और दोनों कारणों से अपरिभाषित हो गए, और p? कोई सुझाव? "अनहेल्ड रिजेक्शन एट: प्रॉमिस {राज्य: 'रिजेक्ट', कारण: अपरिभाषित} कारण: अपरिभाषित"
जेरेमी

3
मैंने इस कोड को अपनी नोड app.jsफ़ाइल के शीर्ष पर जोड़ा है और दुर्भाग्य से कुछ भी लॉग नहीं किया गया है। नोड v10.13.0
उपयोगकर्ता 8.93287

71

अनहेल्दी ईएस 6 प्रॉमिस रिजेक्शंस के लिए एक पूर्ण स्टैकट्रेस दिखाने का सही तरीका है, --trace-warningsध्वज के साथ Node.js चलाना । यह आपके स्वयं के कोड के भीतर से अस्वीकृति को रोके बिना, हर चेतावनी के लिए पूर्ण स्टैकट्रेस दिखाएगा। उदाहरण के लिए:

नोड - अनुग्रह-चेतावनी app.js

सुनिश्चित करें कि trace-warningsझंडा आपकी फ़ाइल के नाम से पहले आए .js! अन्यथा, ध्वज को आपकी स्क्रिप्ट के तर्क के रूप में व्याख्या किया जाएगा, और इसे Node.js द्वारा अनदेखा किया जाएगा।

आप वास्तव में चाहते हैं संभाल बिना क्रिया को अस्वीकृत कर दिया (जैसे। उन्हें प्रवेश करके), तो आप मेरी उपयोग करने के लिए चाहते हो सकता है unhandled-rejectionजो हर प्रमुख वादे कार्यान्वयन के लिए सभी बिना क्रिया को अस्वीकृत कर दिया पकड़ता बजाय मॉड्यूल, कि यह समर्थन करता है, एक भी ईवेंट हैंडलर के साथ।

यही कारण है कि मॉड्यूल का समर्थन करता है Bluebird, ES6 वादे, क्यू, WhenJS, es6-promise, then/promise, और कुछ भी है कि बिना क्रिया अस्वीकृति विनिर्देशों (दस्तावेज में पूरी जानकारी) के किसी भी के अनुरूप है।


20
नोड ०. trace.० का उपयोग करना और यह सब मुझे देता है आंतरिक नोड मॉड्यूल के एक गुच्छा के लिए एक स्टैक ट्रेस है। : ._tickDomainCallback (आंतरिक / प्रक्रिया / next_tick.js: 136: 7)
विल लवेट

3
मुझे ऐसा कोई आउटपुट नहीं दिखाई देता, जो यह दर्शाता हो कि अनहेल्दी वादा मुद्दा कहां है।
जेसन लीच

मैंने इसे package.jsonस्क्रिप्ट शुरू करने के लिए जोड़ा और दुर्भाग्य से कुछ भी लॉग नहीं किया गया। नोड v10.13.0
उपयोगकर्ता1063287

1
@ user1063287 सुनिश्चित करें कि ध्वज आपकी आज्ञा में सही जगह पर है। मैंने उत्तर पर एक अपडेट जोड़ा है, इस बात पर जोर देने के लिए कि इसे स्क्रिप्ट नाम से पहले जाना है ।
स्वेन स्लोटवेग

2
आप संभवतः अपचयन चेतावनी के स्टैक ट्रेस को देख रहे हैं, न कि मूल अखंडित त्रुटि के (जो कि अवतरण चेतावनी के ऊपर कहीं होना चाहिए )।
स्वेन स्लोटवेग

7

स्टैक ट्रेस के साथ लॉगिंग

यदि आप एक सहायक त्रुटि संदेश की अधिक तलाश कर रहे हैं। इसे अपनी नोड फ़ाइल में जोड़ने का प्रयास करें। यह पूर्ण स्टैक ट्रेस प्रदर्शित करना चाहिए जहां आपका क्रैश हो रहा है।

process.on('unhandledRejection', (error, p) => {
  console.log('=== UNHANDLED REJECTION ===');
  console.dir(error.stack);
});

केवल कार्यात्मक अंतर त्रुटि स्टैक प्रॉपर्टी पर एक कंसोल.डेयर कर रहा है। स्वीकृत उत्तर की तुलना में उत्पादन में काफी अंतर।
जोशाकॉक्रे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.