নোড.জেএস + এক্সপ্রেস.জেএস অ্যাপ্লিকেশনগুলির নীতিগুলি পরিচালনা করার সময় ত্রুটি?


177

মনে হচ্ছে ত্রুটি প্রতিবেদন / হ্যান্ডলিং অন্যান্য ফ্রেমওয়ার্কের তুলনায় নোড.জেএস + এক্সপ্রেস.জেএস অ্যাপ্লিকেশনগুলিতে আলাদাভাবে করা হয় । আমি নীচের হিসাবে এটি কাজ করে বুঝতে সঠিক?

ক) আপনার কলব্যাক ফাংশনের পরামিতি হিসাবে ত্রুটিগুলি সনাক্ত করে সনাক্ত করুন । উদাহরণ স্বরূপ:

doSomethingAndRunCallback(function(err) { 
    if(err) {  }
});

খ) পরবর্তী (ভুল) কল করে মিডলওয়্যারের ত্রুটিগুলি রিপোর্ট করুন । উদাহরণ:

handleRequest(req, res, next) {
    // An error occurs…
    next(err);
}

গ) ROUTES এ ত্রুটি নিক্ষেপ করে ত্রুটিগুলি প্রতিবেদন করুন । উদাহরণ:

app.get('/home', function(req, res) {
    // An error occurs
    throw err;
});

ডি) হাতল app.error এর মাধ্যমে আপনার নিজের ত্রুটি হ্যান্ডলার কনফিগার করে ত্রুটি () বা ব্যবহার জেনেরিক কানেক্ট ত্রুটি হ্যান্ডলার। উদাহরণ:

app.error(function(err, req, res, next) {
    console.error(err);
    res.send('Fail Whale, yo.');
});

এই চারটি নীতি কি নোড.জেএস + এক্সপ্রেস.জেএস অ্যাপ্লিকেশনগুলিতে সমস্ত ত্রুটি পরিচালনা / প্রতিবেদনের ভিত্তি?

উত্তর:


183

নোড.জেএস এ পরিচালনা করার সময় ত্রুটি সাধারণত A) ফর্ম্যাটের। বেশিরভাগ কলব্যাকস প্রথম তর্ক হিসাবে বা ত্রুটিযুক্ত বস্তুটিকে ফেরত দেয় null

এক্সপ্রেস.জেএস মিডলওয়্যার ব্যবহার করে এবং মিডওয়্যার সিনট্যাক্সটি বি) এবং ই ব্যবহার করে (নীচে উল্লিখিত)।

গ) খারাপ অভ্যাস যদি আপনি আমাকে জিজ্ঞাসা করেন।

app.get('/home', function(req, res) {
    // An error occurs
    throw err;
});

আপনি উপরের হিসাবে সহজেই উপরে আবার লিখতে পারেন

app.get('/home', function(req, res, next) {
    // An error occurs
    next(err);
});

মিডলওয়্যার সিনট্যাক্স একটি getঅনুরোধে বৈধ ।

ডি হিসাবে হিসাবে)

(07:26:37 অপরাহ্ন) tjholowaychuk: app.error 3.x তে সরানো হয়েছে

টিজে সবেমাত্র নিশ্চিত করেছেন যে app.errorই এর পক্ষে হ্রাস পেয়েছে

ই)

app.use(function(err, req, res, next) {
  // Only handle `next(err)` calls
});

যে কোনও মিডলওয়্যারটির দৈর্ঘ্য 4 (4 টি আর্গুমেন্ট) থাকে ত্রুটি মিডলওয়্যার হিসাবে বিবেচিত হয়। যখন একটি কল next(err)সংযুক্ত হয়ে যায় এবং ত্রুটি-ভিত্তিক মিডওয়্যারের কল করে।


11
ধন্যবাদ! ভবিষ্যতে যে কেউ এটিকে দেখতে পাবে বলে মনে হচ্ছে "মেথড ই" এর জন্য প্যারামের ক্রমটি আসলে ভুল, রেক, রেস, পরের (রেখ, রেস, পরের, এরর এর পরিবর্তে) is
ক্লিন্ট হ্যারিস

9
সুতরাং এটি দুর্দান্ত দেখায়, তবে একটি সমস্যা যা আমি দেখছি তা হ'ল কিছু ত্রুটিগুলি আপনার বর্ণিত ত্রুটি হ্যান্ডলারের কাছে কখনও পৌঁছায় না এবং কেবল একটি প্রক্রিয়া.অন ('uncaughtException', fn) হ্যান্ডলার দ্বারা ধরা পড়ে। প্রচলিত জ্ঞান হ'ল এটি ঘটতে দিন এবং অ্যাপ্লিকেশনটি পুনরায় চালু করতে পছন্দ করুন বা পছন্দ করুন, তবে আপনি যদি তা করেন তবে আপনি কীভাবে বন্ধুত্বপূর্ণ ত্রুটি পৃষ্ঠাটি ফিরিয়ে দেবেন?
পল

1
@ শেভি এছাড়াও, কেবল একটি ফাই ত্রুটি হ্যান্ডলারটি নিক্ষিপ্ত / পরবর্তী ত্রুটির পরে অ্যাপ্লিকেশনটিতে দিতে হবে । এটি যদি আগে হয় তবে এটি ত্রুটিটি ধরবে না।
লি ওলেভর

3
পরবর্তী (মাত্রই ভুল করে) মূলত একটি ত্রুটি নিক্ষেপ এক্সপ্রেস এর সংস্করণ হয়, তাহলে আপনি স্পষ্টভাবে যদিও আপনার নিজের মিডলওয়্যার মধ্যে এটি ফোন করতে হবে
qodeninja

1
@ কোডেনিনজা এই পদ্ধতিটি এক্সপ্রেসের সেরা অনুশীলন হিসাবে বিবেচিত হয়।
ডেভিড অলিভারস

11

জয়য়েন্টের লোকেরা এ সম্পর্কে একটি সত্যই অন্তর্দৃষ্টিপূর্ণ সেরা-অনুশীলন দলিল প্রকাশ করেছে। যে কোনও নোড.জেএস বিকাশকারীকে অবশ্যই পড়তে হবে নিবন্ধ।



দুর্দান্ত নিবন্ধটি, জয়েন্টের আপডেট হওয়া নথিতে নির্দেশ করার জন্য লিঙ্কটি স্থির করেছে।
স্টেফবু

2
নিবন্ধটি খারাপ নয়: তবে অত্যধিক পাঠ্য এবং পর্যাপ্ত উদাহরণ নয় এটি বাস্তব পেশাদারদের জন্য একটি নিবন্ধ
গার্ড

3

প্রথম পরামিতি কেন?

নোড.জেএস এর অ্যাসিক্রোনাস প্রকৃতির কারণে, প্রথম-প্যারামিটার-এর- এরর প্যাটার্নটি ইউজারল্যান্ড নোড.জেএস এর ত্রুটি পরিচালনার জন্য একটি কনভেনশন হিসাবে সুপ্রতিষ্ঠিত হয়েছে । এটি অ্যাসিক্রোনাস কারণ:

try {
    setTimeout(function() {
        throw 'something broke' //Some random error
    }, 5)
}
catch(e) {
   //Will never get caught
}

সুতরাং পরিবর্তে কলব্যাকের প্রথম যুক্তিটি হ'ল ত্রুটিগুলি কেবল নিক্ষেপ করা ব্যতীত পাস করার একমাত্র বুদ্ধিমান উপায়।

এটি করার ফলে এমনটি ঘটবে unhandled exceptionযা কেবল শোনাচ্ছে এমনভাবে বোঝায় যে অ্যাপ্লিকেশনটিকে তার বিভ্রান্তিকর অবস্থার বাইরে নিয়ে যাওয়ার জন্য কিছুই করা হয়নি।

ব্যতিক্রম, কেন তাদের অস্তিত্ব আছে

তবে এটি লক্ষণীয় যে, নোড.জেসের কার্যত সমস্ত অংশই ইভেন্ট-প্রেরক এবং ব্যতিক্রম ছোঁড়া একটি নিম্ন-স্তরের ইভেন্ট যা সমস্ত ইভেন্টের মতো পরিচালনা করা যায়:

//This won't immediately crash if connection fails
var socket = require("net").createConnection(5000);
socket.on("error", function(err) {
    console.error("calm down...", err)
});

এই কিন্তু-shouldn't করতে চরম নিয়ে যাওয়া হবে সমস্ত ত্রুটি ধরা এবং আপনাকে একটি আবেদন যা খুবই কঠিন কখনো বিপর্যস্ত চেষ্টা করবে না। এটি প্রায় প্রতিটি ব্যবহারের ক্ষেত্রে একটি ভয়ানক ধারণা, কারণ এটি অ্যাপ্লিকেশন অবস্থায় কী চলছে সে সম্পর্কে কোনও ধারণা ছাড়াই এটি বিকাশকারীকে ছেড়ে যাবে এবং ট্রাই-ক্যাচ-এ মূল মোড়কের সাথে সাদৃশ্যপূর্ণ।

ডোমেনগুলি - যৌক্তিকভাবে ইভেন্টগুলি গোষ্ঠীভুক্ত করা

অ্যাপ্লিকেশনগুলি পড়ে যাওয়ার ব্যতিক্রমগুলির এই সমস্যার সাথে মোকাবিলার অংশ হিসাবে, ডোমেনগুলি বিকাশকারীকে উদাহরণস্বরূপ এক্সপ্রেস.জেএস অ্যাপ্লিকেশন গ্রহণের অনুমতি দেয় এবং বিপর্যয়কর ব্যর্থতার ঘটনায় সংবেদনশীলতার সাথে সংযোগগুলি বন্ধ করে দেওয়ার চেষ্টা করে এবং বন্ধ করে দেয়।

ES6

সম্ভবত এটি উল্লেখ করা হচ্ছে যে এটি আবার পরিবর্তিত হবে কারণ ইএস 6 জেনারেটর প্যাটার্নটিকে অ্যাসিঙ্ক্রোনাস ইভেন্টগুলি তৈরি করতে দেয় যা এখনও চেষ্টা / ধরার ব্লকগুলির সাথে ধরা যায়।

কোয়া (এক্সপ্রেস.জেএস-এর একই মূল লেখক টি জে হোলোয়াকাক লিখেছেন) লক্ষণীয়ভাবে এটি করে। এটি yieldব্লকগুলি তৈরি করতে ES6 বিবৃতি ব্যবহার করে যা প্রায় সিঙ্ক্রোনাস প্রদর্শিত হলেও সাধারণ নোড অ্যাসিনক্রোনাস ফ্যাশনে পরিচালনা করা হয়:

app.use(function *(next) {
    try {
        yield next;
    } 
    catch (err) {
        this.status = err.status || 500;
        this.body = err.message;
        this.app.emit('error', err, this);
    }
});

app.use(function *(next) {
    throw new Error('some error');
})

এই উদাহরণটি নির্লজ্জভাবে এখান থেকে চুরি করা হয়েছিল ।

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