2015-06-05 2 views
7

anrufe Ich habe ein Mungo-Schema und rufe Model.create() an.Warum kann ich kein .catch anketten, wenn ich mongoose Model.create im Knoten

Wenn ich nach dem 'then' fang 'kette' bekomme ich nicht undefiniert ist keine Funktion, wenn ich gerade die Fehlerfunktion als zweiten Parameter zum 'dann' nenne, dann tue ich das nicht.

Aber wenn ich Methoden wie Model.find aufrufen, kann ich 'fangen' verwenden.

Warum kann ich nicht Kette 'fangen', wenn Model.create Aufruf

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

Works:

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

funktioniert nicht:

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

Weil ihre Versprechen nicht der [A + Spezifikation] entsprechen müssen (https://promisesaplus.com/). Das heißt, angenommen, ".catch" ist in der Spezifikation. Das [Mungo Versprechen] (https://github.com/aheckmann/mpromise) README sagt, dass es der Spezifikation entspricht ... – Chev

+0

So oder so, [die Quelle] (https://github.com/aheckmann/mpromise/ blob/master/lib/promise.js) hat definitiv nicht '.catch': / – Chev

Antwort

8

Nach über sie gehen, es sieht aus wie .catch ist eigentlich nicht Teil der Promises/A+ Spezifikation. Die meisten Bibliotheken scheinen es nur als syntaktischen Zucker zu implementieren. Die MPromise library ist die Versprechen-Bibliothek für Mongoose und es sieht so aus, als ob es die minimalen Anforderungen der Spezifikation erfüllt. Sie könnten versuchen, eine andere Versprechens-Bibliothek zu verwenden, um Mongoose Versprechen zu wickeln, aber es könnte einfacher sein, es einfach zu saugen und mit dem Standardhandler von .then(success, error) zu bleiben.

Wenn Sie sie wickeln wollen, können Sie dies wie folgt tun:

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

Drossel ist mein Lieblings Implementierung, aber fast jede populäre Versprechen Bibliothek hat diese Fähigkeit.

11

angegeben, wie auf http://mongoosejs.com/docs/promises.html

Neu in Mongoose 4.1.0 Während mpromise für grundlegende Anwendungsfälle ausreichend ist, fortgeschrittene Benutzer wollen in ihren Lieblings ES6-Stil stopfen verspricht Bibliothek wie drossel, oder einfach nur benutzen native ES6 verspricht. Setzen Sie einfach mongoose.Promise zu Ihrem Lieblings-ES6-style-Versprechen-Konstruktor und Mungo wird es verwenden.

Sie können Mungo eingestellt drossel zu verwenden mit:

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

An einem gewissen Punkt mpromise scheint für .catch() Unterstützung hinzugefügt zu haben. Ich verwende [email protected] und .catch() funktioniert ordnungsgemäß wie erwartet.

Verwandte Themen