কোন প্রতিশ্রুতি নোড.জেস আনহানডেল্ডপ্রিমাইজেকশন ওয়ার্নিংয়ে কীভাবে হ্যান্ডেল করা হবে তা কীভাবে খুঁজে পাবেন?


177

সংস্করণ 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.

দুর্ভাগ্যক্রমে লাইনটি যেখানে অনুপস্থিত রয়েছে তার কোনও রেফারেন্স নেই। প্রতিটি চেষ্টা / ক্যাপ ব্লক পরীক্ষা না করে এটি খুঁজে পাওয়ার কোনও উপায় আছে কি?


আপনি ব্লুবার্ড প্রতিশ্রুতি গ্রন্থাগারটি ব্যবহার করতে পারেন এবং এটি সম্ভবত আপনাকে একটি স্ট্যাক ট্রেস দেবে।
jਫਰ00

3
সম্ভবত নোডের unhandledRejectionইভেন্টে নিবন্ধন করা সাহায্য করবে? দস্তাবেজগুলি দেখুন । আপনার কলব্যাকটি Errorবস্তুটি এবং আসলটি পেয়েছে Promiseএবং আমি বিশ্বাস করি যে Errorঅবজেক্টটি স্ট্যাক ট্রেস ধারণ করতে পারে।
YSK

পূর্ববর্তী দুটি মন্তব্য যদি সহায়তা না করে তবে Can't set headers after they are sent.আপনার কোডটিতে এটি কোথায় ঘটতে পারে সে সম্পর্কে আপনাকে একটি সূত্র দেওয়া উচিত (উদাহরণস্বরূপ কোথাও আপনি শিরোনামগুলি ইতিমধ্যে প্রেরণ করার পরে স্থাপন করছেন - সম্ভবত অ্যাসিক্রোনাস কোড বোঝার ব্যর্থতার কারণেই , তবে এটি অনুমান)
জারোমন্ডা এক্স

হাই যে বার্তাটি কোডটিতে বাগটি কোথায় রয়েছে তা সন্ধানের জন্য নিশ্চিতভাবে সহায়তা করে, বিটিডব্লিউ এটি লাইনটি জানার মতো সহজ নয়।
ব্যবহারকারী1658162

1
@ জফ্রেন্ড ২০০ এ দেখা গেছে যে এটি একটি পরিস্থিতি ছিল যেখানে একটি অ্যাসিঙ্ক ফাংশন কোনও ত্রুটি ছুঁড়ে মারছিল - এই অ্যাসিঙ্ক ফাংশনগুলির জন্য অভ্যন্তরীণ নোড প্রতিশ্রুতি দেয় যে ব্লুবার্ড কখনও ব্যবহার করবে না, তাই ব্লুবার্ড থাকার ফলে সেই পরিস্থিতিতে কোনও উপকার হয় না।
অ্যাডাম রেইস

উত্তর:


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
আমি আশা করি আমি এটি কাজ করে বলতে পারি, তবে তা হয় না। আমি নোডে 8.9.4।
ffxsam

2
আমি উপরের কোডটি চেষ্টা করেছিলাম এবং উভয় কারণে অপরিবর্তিত হয়েছি, এবং পি? কোনও পরামর্শ? "আনহানডেলড প্রত্যাখ্যান এ: প্রতিশ্রুতি {রাষ্ট্র: 'প্রত্যাখ্যান', কারণ: অপরিজ্ঞাত} কারণ: অপরিবর্তিত"
জেরেমি

3
আমি এই কোডটি আমার নোড app.jsফাইলের শীর্ষে যুক্ত করেছি এবং দুর্ভাগ্যক্রমে কিছুই লগ করা হয়নি। নোড v10.13.0
ব্যবহারকারী 1063287

71

সঠিক Unhandled ES6 প্রতিশ্রুতি rejections জন্য একটি পূর্ণ ক্ষেত্রে স্টেকট্র্যাস দেখানোর জন্য পথ সঙ্গে Node.js চালানো হয় --trace-warningsপতাকা। এটি আপনার নিজের কোডের মধ্যে থেকে প্রত্যাখ্যানকে বাধা না দিয়ে প্রতিটি সতর্কতার জন্য সম্পূর্ণ স্ট্যাকট্রেস প্রদর্শন করবে। উদাহরণ স্বরূপ:

নোড --trace- সতর্কতা app.js

আপনার ফাইলের নামের আগেtrace-warnings পতাকাটি আসবে তা নিশ্চিত করুন! অন্যথায়, পতাকাটি আপনার স্ক্রিপ্টের জন্য একটি আর্গুমেন্ট হিসাবে ব্যাখ্যা করা হবে, এবং এটি নোড.জেএস নিজেই উপেক্ষা করবে।.js

আপনি যদি বাস্তবে অযথিত প্রত্যাখ্যানগুলি হ্যান্ডেল করতে চান (উদাহরণস্বরূপ এগুলি লগ করে), তবে আপনি unhandled-rejectionতার পরিবর্তে আমার মডিউলটি ব্যবহার করতে চাইতে পারেন , যা একক ইভেন্ট হ্যান্ডলারের সাহায্যে প্রতিটি বড় প্রতিশ্রুতি বাস্তবায়নের জন্য সমস্ত অনাহূত প্রত্যাখাতাকে ধরা দেয়।

যে মডিউল সমর্থন Bluebird, ES6 প্রতিশ্রুতি, প্রশ্ন, WhenJS, es6-promise, then/promise, এবং কিছু অপরিচালিত প্রত্যাখ্যান নির্দিষ্টকরণের (ডকুমেন্টেশন পূর্ণ বিবরণ) কোন কে কনর্ফাম করে।


20
নোড 7..৮.০ ব্যবহার করে এবং এটি আমাকে দেয় অভ্যন্তরীণ নোড মডিউলগুলির একগুচ্ছ জন্য একটি স্ট্যাক ট্রেস। (নোড: 10372) আনহানডেলডপ্রাইম রিজেকশনস সতর্কতা: আনহানডেলড প্রতিশ্রুতি প্রত্যাখ্যান (প্রত্যাখ্যান আইডি: 2): ইমিট ওয়ার্নিং (অভ্যন্তরীণ / প্রক্রিয়া / প্রতিশ্রুতি .js: 59: 21) এ ইমিপেন্ডিংহ্যান্ডলডরেজেশনস (অভ্যন্তরীণ / প্রক্রিয়া / প্রতিশ্রুতি .js: 86: 11) প্রক্রিয়াধীন ._টিকডোমাইনক্যালব্যাক (অভ্যন্তরীণ / প্রক্রিয়া / পরের_টিক.জেএস: 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);
});

একমাত্র কার্যকরী পার্থক্যটি ত্রুটির স্ট্যাক সম্পত্তিটিতে একটি কনসোল.ডির করছে। গৃহীত উত্তরের তুলনায় আউটপুটে বেশ পার্থক্য।
জোশুকাকোকরেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.