अपने रूट में async/await का उपयोग करें और सर्वर को गिराए बिना एसिंक्रोनस त्रुटियों को संभालें।
इस पाठ को Kodokon में खोलेंआपके असली रूट मेमोरी में मौजूद ऐरे नहीं लौटाते: वे फ़ाइलें पढ़ते हैं, किसी डेटाबेस से क्वेरी करते हैं, अन्य API को कॉल करते हैं। ये सभी संक्रियाएँ एसिंक्रोनस हैं। आप JavaScript कोर्स से ही async/await को जानते हैं; आइए देखें कि किसी सर्वर में इन्हें साफ़-सुथरे ढंग से कैसे उपयोग किया जाए। पहली अच्छी खबर: एक रूट फ़ंक्शन async हो सकता है।
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) के साथ।
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 को एक सप्ताहांत की परियोजना से अलग करती है।
app.use((err, req, res, next) => {
console.error(err);
res.status(500).json({
error: "Internal server error"
});
});एक अंतिम आदत विकसित करनी है: समानांतरता। दो await के साथ श्रृंखलाबद्ध दो स्वतंत्र संक्रियाएँ एक के बाद एक चलती हैं। Promise.all उन्हें एक साथ शुरू करता है: प्रतिक्रिया का समय सबसे धीमी संक्रिया का होता है, न कि दोनों का योग।
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);
}
});async रूट में, catch द्वारा पकड़ी गई त्रुटि का आप क्या करते हैं?console.log से लॉग करके आगे बढ़नाnext(error) कॉल करनाawait के साथ श्रृंखलाबद्ध करनाPromise.all के साथ एक साथ शुरू करनाsetTimeout का उपयोग करनाerr पहले होता हैerrorHandler होना चाहिए