यहीं:
Post.find({}, function(err, docs) {
if (docs.length == 0)
return res.send({ message: "No posts" });
यदि आप docs.length == 0
. की उस शर्त को पूरा करते हैं , तो आप अनुरोध पर प्रतिक्रिया भेजेंगे। लेकिन, आपका return
केवल Post.find()
से लौट रहा है वापस कॉल करें। यह आपके trendingposts()
से वापस नहीं आ रहा है समारोह।
तो, इस बीच, वह फ़ंक्शन निष्पादित होता रहता है और अंततः इस कोड को प्राप्त होता है:
var mysort = { score: -1 };
Post.find({})
.populate("postedBy")
.populate("comments.postedBy")
.populate("comments.incomments.postedBy")
.populate("comments.likes")
.sort(mysort)
.limit(10)
.exec((er, result) => {
res.json(result);
});
जहां आप फिर उसी अनुरोध पर एक और प्रतिक्रिया भेजते हैं। यही त्रुटि को ट्रिगर करता है Cannot set headers after they are sent to the client
जो आप देखते हैं।
इसे रोकने के कई अलग-अलग तरीके हैं, लेकिन संभवत:ये सभी इस बात से संबंधित हैं कि आप आमतौर पर इस फ़ंक्शन को कैसे साफ़ करेंगे। जिस तरह से यह अभी लिखा गया है, आप अनिवार्य रूप से दो पूरी तरह से अलग एसिंक्रोनस कोड पथ शुरू करते हैं। दोनों Post.find({})
with से शुरू होते हैं और वहां से जाओ। वे प्रत्येक समानांतर में चलते हैं और न ही यह पता है कि दूसरा कोड पथ क्या कर रहा है। जैसे, आपके पास एक से प्रतिक्रिया भेजने का कोई ठोस तरीका नहीं है, लेकिन दोनों से नहीं।
तो, इसे साफ करने का तरीका शायद दो पूरी तरह से अलग एसिंक्रोनस कोड पथ नहीं है। आपको उन्हें किसी तरह से समन्वयित करने की आवश्यकता है। यहां लगभग सभी मामलों में, आप अपने डेटाबेस में वादा-इंटरफ़ेस पर स्विच करना चाहेंगे क्योंकि इससे आपको अपने नियंत्रण प्रवाह के प्रबंधन के लिए बहुत अधिक विकल्प मिलेंगे। उदाहरण के लिए, यदि प्रदर्शन कारणों से, आप एक साथ दो समानांतर अतुल्यकालिक संचालन करना चाहते हैं, तो वादों के साथ, आप Promise.all()
का उपयोग कर सकते हैं या Promise.allSettled()
दोनों की निगरानी करने और यह जानने के लिए कि वे कब किए गए हैं और फिर, दोनों परिणामों के साथ, तय करें कि कौन सा जवाब भेजना है।
या, यदि आप उन्हें अनुक्रमित करना चाहते हैं, तो आप async/await
. का उपयोग कर सकते हैं दो ऑपरेशनों को काफी आसानी से अनुक्रमित करने के लिए और फिर जब आप return
. करते हैं , यह वास्तव में शीर्ष-स्तरीय फ़ंक्शन से वापस आ जाएगा और आगे नियंत्रण प्रवाह को रोक देगा।
यदि आप अपने डेटाबेस में कॉलबैक इंटरफ़ेस के साथ रहना चाहते हैं, तो आपको शायद दूसरे ऑपरेशन को पहले विकल्प में घोंसला बनाना होगा ताकि आप दूसरा ऑपरेशन शुरू न करें यदि आप res.send({ message: "No posts" })
।