2015-06-05 6 views
7

में मेरे पास एक मोंगोज़ स्कीमा है और मैं Model.create() को कॉल कर रहा हूं।मैं क्यों नहीं कर सकता। Mongoose मॉडल को कॉल करते समय मॉडल करें। नोड

जब मैं 'तब' के बाद चेन 'पकड़' करता हूं तो मुझे अपरिभाषित नहीं होता है, अगर मैं केवल 'फ़ंक्शन' के दूसरे पैरामीटर के रूप में त्रुटि फ़ंक्शन को कॉल करता हूं, तो मैं नहीं करता हूं।

लेकिन जब मैं मॉडल.फिंड जैसी विधियों को कॉल करता हूं, तो मैं 'कैच' का उपयोग कर सकता हूं।

क्यों मैं जब Model.create

बुला नहीं कर सकते श्रृंखला 'पकड़'
var mySchema = Mongoose.Schema({ 
    name: String, 
}); 

काम करता है:

KarmaModel.create({ 
      "name": "ss, 
     }) 
     .then(function() { 
      //do somthing 
     },function()=>{ 
      //do somthing 
     }); 

काम करता है नहीं:

KarmaModel.create({ 
      "name": "ss, 
     }) 
     .then(function() { 
      //do somthing 
     }).catch(function()=>{ 
      //do somthing 
     }); 
+0

क्योंकि उनके वादे [ए + विनिर्देश] (https://promisesaplus.com/) के अनुरूप नहीं होना चाहिए। यही है, मान लीजिए '.catch' spec में है। [Mongoose वादा] (https://github.com/aheckmann/mpromise) रीडमे का कहना है कि यह spec के अनुरूप है ... – Chev

+0

किसी भी तरह से, [स्रोत] (https://github.com/aheckmann/mpromise/ ब्लॉब/मास्टर/lib/promise.js) निश्चित रूप से '.catch' नहीं है: / – Chev

उत्तर

8

इस पर जाने के बाद, यह ऐसा लगता है कि .catch वास्तव में Promises/A+ विनिर्देश का हिस्सा नहीं है। अधिकांश पुस्तकालयों में इसे सिंटैक्टिक चीनी के रूप में लागू करने लगते हैं। MPromise library मोंगोस के लिए वादा पुस्तकालय है और ऐसा लगता है कि यह विनिर्देश की न्यूनतम न्यूनतम आवश्यकताओं का पालन करता है। आप मोंगोस के वादे को लपेटने के लिए एक और वादा लाइब्रेरी का उपयोग करने का प्रयास कर सकते हैं, लेकिन इसे आसानी से चूसना और मानक .then(success, error) हैंडलर के साथ चिपकना आसान हो सकता है।

आप उन्हें लपेट करना चाहते हैं, तो आप इस तरह ऐसा कर सकते हैं:

var Promise = require('bluebird'); 
Promise.resolve(KarmaModel.create({ "name": "ss" }) 
    .then(function() { 
    // do something 
    }) 
    .catch(function() { 
    // do something 
    }); 

Bluebird मेरी पसंदीदा कार्यान्वयन है, लेकिन लगभग किसी भी लोकप्रिय वादा पुस्तकालय इस क्षमता है।

11

पर http://mongoosejs.com/docs/promises.html

न्यू निर्दिष्ट के रूप में नेवला 4.1.0 जबकि mpromise बुनियादी उपयोग के मामलों के लिए पर्याप्त है में, उन्नत उपयोगकर्ताओं को उनके पसंदीदा ES6 शैली में प्लग कर सकते हैं Bluebird तरह पुस्तकालय का वादा किया है, या बस का उपयोग मूल ES6 वादे। बस मोंगोज़ सेट करें। अपने पसंदीदा ईएस 6-स्टाइल वादे कन्स्ट्रक्टर से समझौता करें और मोंगोज़ इसका उपयोग करेगा।

आप का उपयोग Bluebird उपयोग करने के लिए नेवला सेट कर सकते हैं:

require("mongoose").Promise = require("bluebird"); 
6

कुछ बिंदु mpromise पर .catch() के लिए समर्थन जोड़ा गया लगता है। मैं [email protected] और .catch() का उपयोग कर रहा हूं ठीक से काम करता हूं।

संबंधित मुद्दे