2014-09-11 14 views
10

olarak bir Dizide sonuçlanıyor Bluebird'in promisifyAll ile mongoose kullanıyorum. Bir model nesnesine saveAsync (kaydetmenin promisified sürümü) adını verdiğimde, tamamlanmış vaatin çözümlenen değeri iki öğeli bir dizisidir. Birincisi kaydedilen model objem, ikincisi ise 1. Burada neler olduğundan emin değilim. Aşağıda, sorunu yeniden oluşturmak için örnek kod bulunmaktadır. I() yöntemi tek bir nesne döndürür kaydet firavunfaresi modeli olarak, bu dizide sadece ilk öğeyi bekliyordumBluebird promisifyAll ile Mongoose - model nesnesinde saveAsync, çözümlenmiş verim değeri

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

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"); 
}) 

alıyorum yanıttır.

Herhangi bir yardım büyük takdir!

cevap

30

Uyarı: Bu davranış bluebird 3 olarak değiştirir - mavi kuş 3'te özel bir argüman promisifyAll geçilecek sürece, söz konusu varsayılan kod çalışacaktır.


.save 'nin geri arama imzası Bu bir değer iade düğüm geri kongre uymayan yana

function (err, product, numberAffected) 

, mavi kuş bir diziye çok değerli bir yanıt dönüştürür. Sayı, etkilenen öğelerin sayısını gösterir (belge DB'de bulunur ve güncelleştirilirse 1).

Sen .spread ile sözdizimsel şeker alabilirsiniz:

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

D'oh! Moğol doktorlarını düzgün okumalıydım! Teşekkürler! –

+1

@winstonsmith Hiçbir zaman mongoose dokümanlarından daha işe yaramaz. –

+0

kesinlikle onlar biraz soyut. Dokümanları tam olarak anlamadığınız durumlarda topluluğa sormak için gongooses gitter'e gidin. – nottinhill

12

Neden sadece kullanmıyor firavunfaresi yerleşik söz desteği?

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){ 
    // .. 
}); 

bu konuda daha fazla bilgi: http://mongoosejs.com/docs/promises.html

+2

Çünkü soru bir yıldan fazladır, bu noktada Mongoose sözleri desteklemedi. – robertklep

+0

@robertklep Mongoose promise desteği ile ilgili bazı detayları ararken thread'i buldum, bu yüzden cevabım diğer ppl için de yararlı olmalı :-) Mevcut kabul edilen cevap aslında yanıltıcıdır. – rckd

+1

Yanıltıcı değil, modası geçmiş. Hangi sorular ve eski :-) :-) ile cevapları olur. – robertklep