डेटा को API के किनारे पर सत्यापित करें और सभी एरर हैंडलिंग को एक अकेले चार-पैरामीटर वाले मिडलवेयर में केंद्रित करें।
इस पाठ को Kodokon में खोलेंआने वाला हर डेटा तब तक शत्रुतापूर्ण है जब तक अन्यथा साबित न हो: JSON बॉडी, URL पैरामीटर, हेडर। सत्यापन एप्लिकेशन के किनारे पर होना चाहिए - कंट्रोलर से पहले - ताकि भीतरी परतें सुनिश्चित डेटा पर काम करें। फिर त्रुटियों के दो परिवारों में भेद करें: परिचालनगत (operational) त्रुटियाँ (अमान्य इनपुट, लुप्त संसाधन, टकराव), जो अपेक्षित होती हैं और 4xx में अनुवादित होती हैं, और प्रोग्रामिंग त्रुटियाँ (बग), जिन्हें क्लाइंट की ओर एक अपारदर्शी 500 और सर्वर की ओर एक पूरा स्टैक ट्रेस उत्पन्न करना चाहिए।
export class HttpError extends Error {
constructor(status, message, details = undefined) {
super(message);
this.status = status;
this.details = details;
}
}एक सत्यापन मिडलवेयर कंट्रोलर से पहले अनुरोध को रोक लेता है। नीचे दिया गया मैनुअल संस्करण सिद्धांत दिखाता है; प्रोडक्शन में, एक घोषणात्मक स्कीमा (zod मानक बन चुका है) अतिरिक्त रूप से टाइप इन्फ़रेंस और संरचित संदेश देती है। समझौता: एक निर्भरता और थोड़ी रनटाइम कीमत, बदले में केंद्रीकृत, संयोजन योग्य नियम जिन्हें भूलना असंभव है।
import { HttpError } from './http-error.js';
export function validateUser(req, res, next) {
const { email, name } = req.body ?? {};
const errors = [];
if (typeof email !== 'string' || !email.includes('@')) {
errors.push('email: invalid format');
}
if (typeof name !== 'string' || name.trim().length < 2) {
errors.push('name: 2 characters minimum');
}
if (errors.length > 0) {
return next(new HttpError(400, 'Invalid body', errors));
}
next();
}Express एक एरर मिडलवेयर को उसके चार-पैरामीटर वाले हस्ताक्षर (err, req, res, next) से पहचानता है। सभी रूट के बाद app.use(errorHandler) के साथ अंत में पंजीकृत, यह API का एकमात्र एरर निकास बन जाता है: एक समरूप प्रतिक्रिया प्रारूप, एक ही जगह लॉगिंग, आंतरिक जानकारी का कोई रिसाव नहीं। कंट्रोलर, अपनी ओर से, बस next(err) कॉल करते हैं।
export function errorHandler(err, req, res, next) {
if (res.headersSent) {
return next(err);
}
const status = err.status ?? 500;
const body = { error: err.message };
if (err.details) {
body.details = err.details;
}
if (status >= 500) {
console.error(err);
body.error = 'Internal server error';
}
res.status(status).json(body);
}