Kodokon kodokon.com

इनपुट सत्यापन और एरर मिडलवेयर

डेटा को API के किनारे पर सत्यापित करें और सभी एरर हैंडलिंग को एक अकेले चार-पैरामीटर वाले मिडलवेयर में केंद्रित करें।

9 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

आने वाला हर डेटा तब तक शत्रुतापूर्ण है जब तक अन्यथा साबित न हो: JSON बॉडी, URL पैरामीटर, हेडर। सत्यापन एप्लिकेशन के किनारे पर होना चाहिए - कंट्रोलर से पहले - ताकि भीतरी परतें सुनिश्चित डेटा पर काम करें। फिर त्रुटियों के दो परिवारों में भेद करें: परिचालनगत (operational) त्रुटियाँ (अमान्य इनपुट, लुप्त संसाधन, टकराव), जो अपेक्षित होती हैं और 4xx में अनुवादित होती हैं, और प्रोग्रामिंग त्रुटियाँ (बग), जिन्हें क्लाइंट की ओर एक अपारदर्शी 500 और सर्वर की ओर एक पूरा स्टैक ट्रेस उत्पन्न करना चाहिए।

JAVASCRIPT
export class HttpError extends Error {
  constructor(status, message, details = undefined) {
    super(message);
    this.status = status;
    this.details = details;
  }
}
एक त्रुटि जो अपना HTTP स्टेटस अपने साथ रखती है: बुनियादी निर्माण-खंड।

एक सत्यापन मिडलवेयर कंट्रोलर से पहले अनुरोध को रोक लेता है। नीचे दिया गया मैनुअल संस्करण सिद्धांत दिखाता है; प्रोडक्शन में, एक घोषणात्मक स्कीमा (zod मानक बन चुका है) अतिरिक्त रूप से टाइप इन्फ़रेंस और संरचित संदेश देती है। समझौता: एक निर्भरता और थोड़ी रनटाइम कीमत, बदले में केंद्रीकृत, संयोजन योग्य नियम जिन्हें भूलना असंभव है।

JAVASCRIPT
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();
}
इसे router.post('/', validateUser, controller.create) के साथ जोड़ें।

Express एक एरर मिडलवेयर को उसके चार-पैरामीटर वाले हस्ताक्षर (err, req, res, next) से पहचानता है। सभी रूट के बाद app.use(errorHandler) के साथ अंत में पंजीकृत, यह API का एकमात्र एरर निकास बन जाता है: एक समरूप प्रतिक्रिया प्रारूप, एक ही जगह लॉगिंग, आंतरिक जानकारी का कोई रिसाव नहीं। कंट्रोलर, अपनी ओर से, बस next(err) कॉल करते हैं।

JAVASCRIPT
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);
}
क्लाइंट के लिए 4xx पारदर्शी, 500 छिपा हुआ लेकिन लॉग किया गया।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. Express एक एरर मिडलवेयर को एक साधारण मिडलवेयर से कैसे अलग पहचानता है?
    • उसके नाम से, जिसमें error शब्द होना चाहिए
    • उसके चार-पैरामीटर वाले हस्ताक्षर (err, req, res, next) से
    • श्रृंखला में उसकी पहली स्थिति से
    • app.setErrorHandler के एक स्पष्ट कॉल से
  2. किसी अप्रत्याशित प्रोग्रामिंग त्रुटि पर सही HTTP प्रतिक्रिया क्या है?
    • निदान में मदद के लिए संदेश और स्टैक के साथ एक 500
    • यह संकेत देने के लिए एक 400 कि अनुरोध विफल रहा
    • एक सामान्य संदेश के साथ एक 500, पूरी त्रुटि सर्वर की ओर लॉग की जाती है
  3. Express 4 में, यदि कोई async हैंडलर try/catch के बिना अस्वीकृत हो जाए तो क्या होता है?
    • त्रुटि फिर भी एरर मिडलवेयर तक पहुँचती है
    • अनुरोध अटका रहता है: अस्वीकृति कभी next की ओर अग्रेषित नहीं होती
    • Express अपने आप एक 400 लौटाता है
    • Node प्रोसेस तुरंत रुक जाती है