আমার ব্যবহারের ক্ষেত্রে একটি কাস্টম JSON ত্রুটি বার্তা প্রেরণ করা হচ্ছে, যেহেতু আমি আমার REST এপিআই পাওয়ার জন্য এক্সপ্রেস ব্যবহার করছি। আমি মনে করি এটি মোটামুটি সাধারণ পরিস্থিতি, তাই আমার উত্তরে এটিতে মনোনিবেশ করা হবে।
সংক্ষিপ্ত সংস্করণ:
এক্সপ্রেস ত্রুটি পরিচালনা
তিনটির পরিবর্তে চারটি যুক্তি ব্যতীত অন্য মিডলওয়্যারের মতো ত্রুটি-পরিচালনা মিডলওয়্যারটিকে সংজ্ঞায়িত করুন, বিশেষত স্বাক্ষর সহ (এরর, রিক, রেস, পরবর্তী)। ... আপনি অন্যান্য অ্যাপ্লিকেশন (ইউএস) এবং রুটের কলগুলির পরে, ত্রুটি-পরিচালনা করে মিডলওয়্যারটিকে সর্বশেষে সংজ্ঞায়িত করেন
app.use(function(err, req, res, next) {
if (err instanceof JSONError) {
res.status(err.status).json({
status: err.status,
message: err.message
});
} else {
next(err);
}
});
কোডের যে কোনও বিন্দু থেকে ত্রুটিগুলি উত্থাপন করুন:
var JSONError = require('./JSONError');
var err = new JSONError(404, 'Uh oh! Can't find something');
next(err);
দীর্ঘ সংস্করণ
ত্রুটি নিক্ষেপ করার প্রমিত উপায় হ'ল:
var err = new Error("Uh oh! Can't find something");
err.status = 404;
next(err)
ডিফল্টরূপে, এক্সপ্রেস এটিকে 402 কোড সহ একটি এইচটিটিপি রেসপন্স হিসাবে খুব সুন্দরভাবে প্যাকেজিংয়ের মাধ্যমে পরিচালনা করে এবং মেসেজের স্ট্রিংটি স্ট্যাক ট্রেসের সাহায্যে সংযুক্ত করে।
উদাহরণ হিসাবে উদাহরণস্বরূপ, যখন আমি এক্সপ্রেসটিকে একটি REST সার্ভার হিসাবে ব্যবহার করি তখন এটি আমার পক্ষে কার্যকর হয় না। আমি ত্রুটিটি এইচটিএমএল হিসাবে নয়, জেএসএন হিসাবে ফেরত পাঠাতে চাই। আমি অবশ্যই চাইব না যে আমার স্ট্যাকের ট্রেসটি আমার ক্লায়েন্টের দিকে চলে।
আমি প্রতিক্রিয়া হিসাবে JSON প্রেরণ করতে পারেন req.json(), উদাহরণস্বরূপ। মত কিছু req.json({ status: 404, message: 'Uh oh! Can't find something'})। Allyচ্ছিকভাবে, আমি ব্যবহার করে স্থিতি কোডটি সেট করতে পারি req.status()। দুটি সংমিশ্রণ:
req.status(404).json({ status: 404, message: 'Uh oh! Can't find something'});
এটি একটি কবজির মতো কাজ করে। এটি বলেছিল যে, আমার যতবার ত্রুটি হয়েছে ততবার টাইপ করা আমার পক্ষে যথেষ্ট অযৌক্তিক মনে হয় এবং কোডটি আর আমাদের মতো স্ব-ডকুমেন্টিং হয় না next(err)। এটি কোনও সাধারণ (যেমন, বৈধ) প্রতিক্রিয়া জেএসএনকে কীভাবে প্রেরণ করা হয়েছে তার থেকে অনেক বেশি মিল দেখায়। তদ্ব্যতীত, আধ্যাত্মিক পদ্ধতির দ্বারা নিক্ষিপ্ত যে কোনও ত্রুটি তার ফলস্বরূপ এইচটিএমএল আউটপুট দেয়।
এইখানেই মিডলওয়্যার পরিচালনা করতে এক্সপ্রেসের ত্রুটি আসে my আমার রুটের অংশ হিসাবে, আমি সংজ্ঞা দিই:
app.use(function(err, req, res, next) {
console.log('Someone tried to throw an error response');
});
আমি একটি কাস্টম JSONError ক্লাসে সাবক্লাস ত্রুটিও করেছি:
JSONError = function (status, message) {
Error.prototype.constructor.call(this, status + ': ' + message);
this.status = status;
this.message = message;
};
JSONError.prototype = Object.create(Error);
JSONError.prototype.constructor = JSONError;
এখন, আমি কোডটিতে একটি ত্রুটি ফেলতে চাইলে আমি এটি করি:
var err = new JSONError(404, 'Uh oh! Can't find something');
next(err);
মিডলওয়্যার পরিচালনা করার জন্য কাস্টম ত্রুটিতে ফিরে গিয়ে আমি এটিকে সংশোধন করি:
app.use(function(err, req, res, next) {
if (err instanceof JSONError) {
res.status(err.status).json({
status: err.status,
message: err.message
});
} else {
next(err);
}
}
JSONError এ সাবক্লাসিং ত্রুটিটি গুরুত্বপূর্ণ, কারণ আমার সন্দেহ হয় যে কোনও এক্সপ্রেস এক্সপ্লোরার instanceof Errorপ্রথম প্যারামিটারটিতে একটি চেক করে যা next()একটি সাধারণ হ্যান্ডলার বা ত্রুটি হ্যান্ডলারটি আবশ্যক কিনা তা নির্ধারণ করার জন্য এটি একটি পাস হয়েছে । instanceof JSONErrorঅপ্রত্যাশিত ত্রুটিগুলি (যেমন ক্রাশের মতো) এছাড়াও জেএসওএন প্রতিক্রিয়া ফিরিয়ে আনতে আমি চেকটি সরিয়ে ফেলতে এবং সামান্য পরিবর্তন করতে পারি।