2014-09-11 8 views
10

के रूप में एक ऐरे में सहेजने के परिणामस्वरूप मैं ब्लूबर्ड के प्रोमोसिफा का उपयोग कर रहा हूं। जब मैं मॉडल ऑब्जेक्ट पर saveAsync (सहेजने का प्रोमिसिफाइड संस्करण) कहता हूं, तो पूर्ण वादे का हल मूल्य दो तत्वों के साथ सरणी है। पहला मेरा सहेजा गया मॉडल ऑब्जेक्ट है, दूसरा पूर्णांक 1 है। यकीन नहीं है कि यहाँ क्या हो रहा है। इस मुद्दे को पुन: पेश करने के लिए नीचे उदाहरण कोड है।ब्लूबर्ड के साथ मोंगोस promisifyAll - मॉडल ऑब्जेक्ट पर saveAsync को हल किए गए वादे मूल्य

var mongoose = require("mongoose"); 

var Promise = require("bluebird"); 


Promise.promisifyAll(mongoose); 


var PersonSchema = mongoose.Schema({ 
    'name': String 
}); 

var Person = mongoose.model('Person', PersonSchema); 

mongoose.connect('mongodb://localhost/testmongoose'); 


var person = new Person({ name: "Joe Smith "}); 

person.saveAsync() 
.then(function(savedPerson) { 
    //savedPerson will be an array. 
    //The first element is the saved instance of person 
    //The second element is the number 1 
    console.log(JSON.stringify(savedPerson)); 
}) 
.catch(function(err) { 
    console.log("There was an error"); 
}) 

प्रतिक्रिया मैं

[{"__v":0,"name":"Joe Smith ","_id":"5412338e201a0e1af750cf6f"},1] 

मुझे लगता है कि सरणी में सिर्फ पहला आइटम उम्मीद कर रहा था, नेवला मॉडल को बचाने() विधि एक वस्तु देता है के रूप में है।

किसी भी मदद की सराहना की जाएगी!

उत्तर

30

चेतावनी: यह व्यवहार ब्लूबर्ड 3 के रूप में बदलता है - ब्लूबर्ड 3 में प्रश्न में डिफ़ॉल्ट कोड तब तक काम करेगा जब तक कोई विशेष तर्क promisifyAll को पास नहीं किया जाएगा।


.save के कॉलबैक के हस्ताक्षर है:

function (err, product, numberAffected) 

के बाद से यह एक मूल्य लौटने का नोड कॉलबैक सम्मेलन को पालन नहीं करती है, Bluebird एक सरणी में कई महत्वपूर्ण प्रतिक्रिया बदल देता है। संख्या प्रभावित वस्तुओं की संख्या का प्रतिनिधित्व करती है (1 यदि दस्तावेज डीबी में पाया गया था और अपडेट किया गया था)।

आप .spread साथ वाक्यात्मक चीनी प्राप्त कर सकते हैं:

person.saveAsync() 
.spread(function(savedPerson, numAffected) { 
    //savedPerson will be the person 
    //you may omit the second argument if you don't care about it 
    console.log(JSON.stringify(savedPerson)); 
}) 
.catch(function(err) { 
    console.log("There was an error"); 
}) 
+3

डी 'ओह! मुझे सिर्फ मोंगोज़ दस्तावेज़ों को ठीक से पढ़ना चाहिए था! धन्यवाद! –

+1

@winstonsmith मैंने कभी mongoose दस्तावेज़ों से अधिक बेकार डॉक्स नहीं किया है। –

+0

वे निश्चित रूप से थोड़ा सा सार हैं। यदि आप दस्तावेज़ों को पूरी तरह समझ नहीं पाते हैं तो समुदाय से पूछने के लिए मोंगोस गिटार पर जाएं। – nottinhill

12

क्यों बस का उपयोग नहीं कर नेवला के अंतर्निहित वादा समर्थन करते हैं?

var mongoose = require('mongoose'); 
var Promise = require('bluebird'); 

mongoose.Promise = Promise; 
mongoose.connect('mongodb://localhost:27017/<db>'); 

var User = require('./models/user'); 
User.findOne({}).then(function(user){ 
    // .. 
}); 

इसके बारे में और अधिक पढ़ें: http://mongoosejs.com/docs/promises.html

+2

क्योंकि सवाल एक वर्ष से अधिक पुराना है, जिस समय मोंगोस ने वादे का समर्थन नहीं किया था। – robertklep

+0

@robertklep मैंने पाया कि धागा मोन्गोज़ वादे समर्थन के बारे में कुछ विवरण खोजने के दौरान, इसलिए मेरा उत्तर अन्य पीपीएल के लिए भी उपयोगी होना चाहिए :-) वास्तव में वर्तमान स्वीकार्य उत्तर भ्रामक है। – rckd

+1

यह भ्रामक नहीं है, यह पुराना है। जो पुराने और प्रश्नों के उत्तर के साथ होता है :-) – robertklep

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