2015-06-05 20 views
7

調用貓鼬Model.create當我不鏈條.catch我有一個貓鼬架構和我打電話Model.create()。爲什麼可以在節點

當我以後鏈「抓」的「然後」我得到了一個未定義不是一個函數,如果我只是叫誤差函數作爲第二個參數「然後」,然後我不知道。

但是,當我打電話的方法,如Model.find,我可以用「抓」。

爲什麼我不能鏈 '抓' 調用Model.create

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

作品:

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

不起作用:

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

由於其必須承諾不符合[A +規格](https://promisesaplus.com/)。也就是說,假設'.catch'在規範中。 [貓鼬承諾](https://github.com/aheckmann/mpromise)自述文件說它符合規範... – Chev

+0

無論哪種方式,[來源](https://github.com/aheckmann/mpromise/ blob/master/lib/promise.js)肯定沒有'.catch':/ – Chev

回答

8

去在它之後,它貌似.catch實際上不是Promises/A+規範的一部分。大多數圖書館似乎都將其作爲語法糖來實現。 MPromise library是Mongoose的承諾庫,它看起來像遵守規範的最低要求。你可以嘗試使用其他承諾庫包貓鼬的承諾,但它可能是更容易只是把它吸上來,並與標準.then(success, error)處理堅持。

如果你想包裝他們,你可以這樣做是這樣的:

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

藍鳥是我最喜歡的實現,但是幾乎所有流行的諾言庫有這個能力。

11

如貓鼬4.1.0 雖然mpromise足以滿足基本用例上http://mongoosejs.com/docs/promises.html

新規定,高級用戶可能想在自己喜歡的ES6式堵塞承諾圖書館像藍鳥,或只是使用原生ES6承諾。只需設置mongoose.Promise到您最喜愛的ES6風格承諾構造和貓鼬將使用它。

您可以設置貓鼬使用藍鳥使用:

require("mongoose").Promise = require("bluebird"); 
相關問題