जबकि आपका कोड कुछ त्रुटि मामलों को संभालता नहीं है, और गलत find
. का उपयोग करता है फ़ंक्शन, सामान्य प्रवाह विशिष्ट है जो वह कार्य देता है जो आप करना चाहते हैं।
- यदि डुप्लिकेट के अलावा अन्य त्रुटियां हैं, तो कॉलबैक को कॉल नहीं किया जाता है, जिसके कारण आपके NodeJs एप्लिकेशन में डाउनस्ट्रीम समस्याएं हो सकती हैं
- उपयोग
findOne
के बजायfind
चूंकि कुंजी अद्वितीय है, इसलिए केवल एक ही परिणाम होगा। अन्यथा, यह एक सरणी लौटाएगा। - यदि आपके कॉलबैक में पारंपरिक
error
की अपेक्षा की जाती है पहले तर्क के रूप में, आप सीधे कॉलबैक कोfindOne
. पर पास कर सकते हैं एक अनाम फ़ंक्शन शुरू करने के बजाय फ़ंक्शन। - आप
findOneAndUpdate
भी देखना चाहेंगे अंततः, इस पर निर्भर करता है कि आपका अंतिम स्कीमा और तर्क क्या होगा।
जैसा कि उल्लेख किया गया है, आप findOneAndUpdate
. का उपयोग करने में सक्षम हो सकते हैं , लेकिन अतिरिक्त लागत के साथ।
function save(id, title, callback) {
Value.findOneAndUpdate(
{id: id, title: title}, /* query */
{id: id, title: title}, /* update */
{ upsert: true}, /* create if it doesn't exist */
callback);
}
निश्चित रूप से अभी भी कॉलबैक है, लेकिन डुप्लिकेट मिलने पर यह डेटा को फिर से लिखेगा। क्या यह समस्या वास्तव में उपयोग के मामलों पर निर्भर करती है।
मैंने आपके कोड की थोड़ी सफाई की है... लेकिन यह वास्तव में काफी सरल है और कॉलबैक स्पष्ट होना चाहिए। callback
फ़ंक्शन को हमेशा या तो नया सहेजा गया दस्तावेज़ प्राप्त होता है या जिसे डुप्लिकेट के रूप में मिलान किया गया था। यह saveNewValue
. को कॉल करने वाले फंक्शन की जिम्मेदारी है त्रुटि की जांच करने और इसे ठीक से संभालने के लिए। आप देखेंगे कि कैसे मैंने यह भी सुनिश्चित किया है कि कॉलबैक को त्रुटि के प्रकार की परवाह किए बिना कॉल किया जाता है और हमेशा परिणाम के साथ एक सुसंगत तरीके से कॉल किया जाता है।
function saveNewValue(id, title, callback) {
if (!callback) { throw new Error("callback required"); }
var thisValue = new models.Value({
id:id,
title:title //this is a unique value
});
thisValue.save(function(err, product) {
if (err) {
if (err.code === 11000) { //error for dupes
return models.Value.findOne({title:title}, callback);
}
}
callback(err, product);
});
}
वैकल्पिक रूप से, आप वादा का उपयोग कर सकते हैं नमूना। यह उदाहरण when.js का उपयोग कर रहा है ।
var when = require('when');
function saveNewValue(id, title) {
var deferred = when.defer();
var thisValue = new models.Value({
id:id,
title:title //this is a unique value
});
thisValue.save(function(err, product) {
if (err) {
if (err.code === 11000) { //error for dupes
return models.Value.findOne({title:title}, function(err, val) {
if (err) {
return deferred.reject(err);
}
return deferred.resolve(val);
});
}
return deferred.reject(err);
}
return deferred.resolve(product);
});
return deferred.promise;
}
saveNewValue('123', 'my title').then(function(doc) {
// success
}, function(err) {
// failure
});