2014-09-11 9 views
10

Używam promisifyAll bluebird z mangustą. Kiedy wywołuję saveAsync (promisified version of save) na obiekcie modelu, rozstrzygnięta wartość wypełnionej obietnicy to tablica z dwoma elementami. Pierwszy to mój zapisany obiekt modelu, drugi to liczba całkowita 1. Nie jestem pewien, co się tutaj dzieje. Poniżej znajduje się przykład kodu służącego do odtworzenia problemu.Mongoose z Bluebird promisifyAll - saveAsync na obiekcie modelu powoduje, że macierz jako rozstrzygnięta wartość obietnicy

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

Odpowiedź mogę to

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

Spodziewałem się tylko pierwszy element w tej tablicy, jak model mangusty save() zwraca pojedynczy obiekt.

Każda pomoc będzie bardzo ceniona!

Odpowiedz

30

Ostrzeżenie: Takie zachowanie zmienia się Bluebird 3 - w Bluebird 3 domyślny kod w pytaniu będzie działać, chyba że specjalny argument, zostaną przekazane do promisifyAll.


Podpis zwrotnego .save „s jest:

function (err, product, numberAffected) 

Ponieważ nie trwa do węzła konwencji wywołania zwrotnego z powrotem jedną wartość, Bluebird zamienia wielokrotne wartościową odpowiedź do tablicy. Liczba reprezentuje liczbę wykonanych elementów (1, jeśli dokument został znaleziony i zaktualizowany w DB).

Można dostać cukier syntaktyczny z .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

D'oh! Powinienem dokładnie przeczytać dokumentację mangusty! Dzięki! –

+1

@winstonsmith Nigdy nie docs doktryny bardziej bezużyteczne niż dokumenty Mongoose. –

+0

są z pewnością nieco abstrakcyjne. idź do mongooses gitter zapytać społeczność na wypadek, gdy nie rozumiesz w pełni dokumentów. – nottinhill

12

Dlaczego nie tylko za pomocą wbudowanego wsparcia obietnicy Mongoose za?

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

Czytaj więcej na ten temat: http://mongoosejs.com/docs/promises.html

+2

Ponieważ pytanie ma więcej niż rok, w którym to momencie Mongoose nie poparło obietnic. – robertklep

+0

@robertklep Znalazłem ten wątek podczas szukania pewnych szczegółów na temat wsparcia obietnic mangi, więc moja odpowiedź powinna być przydatna również dla innych osób :-) Obecna zaakceptowana odpowiedź w rzeczywistości jest myląca. – rckd

+1

Nie wprowadza w błąd, jest nieaktualny. Co dzieje się z pytaniami i odpowiedziami, które są stare :-) – robertklep