Kodokon kodokon.com

व्यवहार में एसिंक्रोनस

अपने रूट में async/await का उपयोग करें और सर्वर को गिराए बिना एसिंक्रोनस त्रुटियों को संभालें।

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

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

आपके असली रूट मेमोरी में मौजूद ऐरे नहीं लौटाते: वे फ़ाइलें पढ़ते हैं, किसी डेटाबेस से क्वेरी करते हैं, अन्य API को कॉल करते हैं। ये सभी संक्रियाएँ एसिंक्रोनस हैं। आप JavaScript कोर्स से ही async/await को जानते हैं; आइए देखें कि किसी सर्वर में इन्हें साफ़-सुथरे ढंग से कैसे उपयोग किया जाए। पहली अच्छी खबर: एक रूट फ़ंक्शन async हो सकता है।

JAVASCRIPT
import express from "express";
import { readFile } from "node:fs/promises";

const app = express();

app.get("/report", async (req, res) => {
  const raw = await readFile("report.json", "utf8");
  res.json(JSON.parse(raw));
});

app.listen(3000);

यह कोड काम करता है... जब तक report.json मौजूद है। यदि पठन विफल होता है, तो प्रॉमिस अस्वीकृत हो जाता है और, Express के संस्करण के आधार पर, रिक्वेस्ट बिना प्रतिक्रिया के रह जाती है या त्रुटि लॉग में लीक हो जाती है। पेशेवर नियम: हर async रूट अपनी त्रुटियों को संभालता है, try/catch और next(error) के साथ।

JAVASCRIPT
app.get("/report", async (req, res, next) => {
  try {
    const raw = await readFile("report.json", "utf8");
    res.json(JSON.parse(raw));
  } catch (error) {
    next(error);
  }
});

next(error) त्रुटि को केंद्रीकृत त्रुटि हैंडलर को सौंप देता है। यह चार पैरामीटर वाला एक मिडलवेयर है, जिसे सभी रूट के बाद घोषित किया जाता है। त्रुटियों को लॉग और प्रारूपित करने के लिए एक ही स्थान: यही वह चीज़ है जो एक अनुरक्षणीय API को एक सप्ताहांत की परियोजना से अलग करती है।

JAVASCRIPT
app.use((err, req, res, next) => {
  console.error(err);
  res.status(500).json({
    error: "Internal server error"
  });
});
हमेशा अंत में, रूट के बाद

एक अंतिम आदत विकसित करनी है: समानांतरता। दो await के साथ श्रृंखलाबद्ध दो स्वतंत्र संक्रियाएँ एक के बाद एक चलती हैं। Promise.all उन्हें एक साथ शुरू करता है: प्रतिक्रिया का समय सबसे धीमी संक्रिया का होता है, न कि दोनों का योग।

JAVASCRIPT
async function fetchUsers() {
  return [{ id: 1, name: "Ada" }];
}

async function fetchTasks() {
  return [{ id: 1, title: "Review the code" }];
}

app.get("/dashboard", async (req, res, next) => {
  try {
    const [users, tasks] = await Promise.all([
      fetchUsers(),
      fetchTasks()
    ]);
    res.json({ users, tasks });
  } catch (error) {
    next(error);
  }
});

ज्ञान जांच

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

  1. किसी async रूट में, catch द्वारा पकड़ी गई त्रुटि का आप क्या करते हैं?
    • इसे console.log से लॉग करके आगे बढ़ना
    • इसे त्रुटि हैंडलर को सौंपने के लिए next(error) कॉल करना
    • रिक्वेस्ट को स्वतः पुनः प्रयास करना
  2. दो स्वतंत्र एसिंक्रोनस कॉल यथासंभव तेज़ी से चलनी चाहिए। आप कौन सा दृष्टिकोण चुनते हैं?
    • उन्हें दो क्रमिक await के साथ श्रृंखलाबद्ध करना
    • उन्हें Promise.all के साथ एक साथ शुरू करना
    • दोनों के बीच setTimeout का उपयोग करना
  3. Express किसी त्रुटि-संभालने वाले मिडलवेयर को कैसे पहचानता है?
    • इसके चार-पैरामीटर सिग्नेचर से, जिसमें err पहले होता है
    • फ़ंक्शन के नाम से, जो errorHandler होना चाहिए
    • फ़ाइल के शीर्ष पर इसकी स्थिति से