पाठ 16 / 23

असिंक्रोनस एरर हैंडलिंग

असिंक्रोनस हैंडलर में फेंकी गई त्रुटियों को स्पष्ट रूप से आगे भेजना ज़रूरी है।

एक ख़तरा

Express 4 में, async route हैंडलर के अंदर रिजेक्ट हुआ promise अपने-आप एरर हैंडलर तक नहीं पहुँचता — यह चुपचाप क्रैश हो जाता है या रिक्वेस्ट अटक जाती है।

पकड़ें और आगे भेजें

बॉडी को try/catch में लपेटें और next(err) बुलाएँ — या दोहराव से बचने के लिए एक छोटा हेल्पर उपयोग करें।

const asyncHandler = (fn) => (req, res, next) =>
  Promise.resolve(fn(req, res, next)).catch(next);

app.get('/users/:id', asyncHandler(async (req, res) => {
  const user = await db.users.findById(req.params.id);
  if (!user) {
    const err = new Error('User not found');
    err.status = 404;
    throw err;
  }
  res.json(user);
}));

Express 5 इसे ठीक करता है

Express 5, async हैंडलर से रिजेक्ट हुए promise को अपने-आप next(err) तक भेजता है — Express 5 पर wrapper की ज़रूरत नहीं रहती।