2015-06-05 7 views
7

Ho uno schema di mangusta e sto chiamando Model.create().Perché non riesco a concatenare .catch quando si chiama mongoose Model.create nel nodo

Quando I catena 'catch' dopo il 'poi' ottengo indefinito non è una funzione, se solo chiamare la funzione di errore come il secondo parametro per 'poi', quindi non lo faccio.

Ma quando chiamo metodi come Model.find, posso usare 'catch'.

Perché non posso catena di 'catturare' al momento della chiamata Model.create

var mySchema = Mongoose.Schema({ 
    name: String, 
}); 

Works:

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

non funziona:

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

Perché le loro promesse non devono essere conformi alla [Specifica A +] (https://promisesaplus.com/). Cioè, supponendo che '.catch' sia nella specifica. La [promessa della mangusta] (https://github.com/aheckmann/mpromise) README dice che è conforme allo spec ... – Chev

+0

In entrambi i casi, [la fonte] (https://github.com/aheckmann/mpromise/ blob/master/lib/promise.js) sicuramente non ha '.catch': / – Chev

risposta

8

Dopo essere andato su di esso, è assomiglia a .catch non è in realtà parte della specifica Promises/A+. La maggior parte delle biblioteche sembra implementarla come zucchero sintattico. Lo MPromise library è la libreria promessa per Mongoose e sembra che rispetti i requisiti minimi della specifica. Potresti provare a utilizzare un'altra libreria di promessa per racchiudere le promesse di Mongoose, ma potrebbe essere più semplice semplicemente prenderlo e attenersi al gestore standard .then(success, error).

Se si vuole avvolgerli, è possibile farlo in questo modo:

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

Bluebird è la mia realizzazione preferita, ma quasi qualsiasi libreria promessa popolare ha questa capacità.

11

Come specificato sul http://mongoosejs.com/docs/promises.html

Nuovo in Mongoose 4.1.0 Mentre mpromise è sufficiente per casi d'uso di base, gli utenti più esperti potrebbero voler inserire nel proprio stile preferito ES6 promette biblioteca come Bluebird, o semplicemente usare promessa nativa ES6. Basta impostare mangusta. Promuovi il tuo costruttore di promesse in stile ES6 preferito e mangusta lo userà.

È possibile impostare mangusta di utilizzare Bluebird utilizzando:

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

Ad un certo punto mpromise sembra aver aggiunto il supporto per .catch(). Sto usando [email protected] e .catch() funziona correttamente come previsto.

Problemi correlati