2015-10-28 73 views
2

我有一個Account模式,與貓鼬定義,我設置的承諾與藍鳥:如何處理使用Bluebird的使用Mongoose返回的諾言?

var mongoose = require('mongoose'); 
mongoose.Promise = require('bluebird'); 

我設計這種模式的模型方法:

accountSchema.methods.validPassword = function(password) { 
    return bcrypt.compareSync(password, this.password); 
} 

所以我有一個方法這將試圖找到一個用戶,並檢查密碼匹配:

function login (email,password) { 

    return Account.findOne({email: email}).then(function (user) { 
     console.log(user); 
     user["match"] = user.validPassword(password); 
     console.log(user); 
     return user.validPassword(password); 
    }); 
} 

什麼是真正奇怪的是第二個console.log不會顯示該對象的任何match屬性。

這裏我的意圖是返回找到用戶併爲您的密碼匹配的承諾,但是當我調用登錄:

login("email","password").then(function(user){...}) 

用戶不具有匹配屬性,我怎麼可能實現這一目標?

回答

3

你不能這樣做既調用無極調用之前返回:返回Account.xxxxx 做了。後來()......它的一個非此即彼的...我給你兩種選擇。版本A我們處理結果集本地登錄功能:

function login (email,password) { 

    // notice I no longer have return Account.xxxx 
    Account.findOne({email: email}) // Account.findOne returns a Promise 
    .then(function (user) { 

     if (user) { 

      user.match = user.validPassword(password); 
      // execute some callback here or return new Promise for follow-on logic 

     } else { 
      // document not found deal with this 
     } 

    }).catch(function(err) { 

     // handle error 
    }); 
} 

這裏調用程序:

login("email","password") // needs either a cb or promise 
.then(function(userProcessed) { ... 
}). 

...而版本B,我們貶謫處理,以主叫做。那麼()的邏輯:

function login (email,password) { 

    return Account.findOne({email: email}); 
} 

所以在來電者,我們有:

login("email","password").then(function(userNotProcessed){...}) 

findOne獲得結果集後,對user執行一些驗證,避免假設找到它。 此外,由於無極現在在ES6,您可以使用內置的承諾執行

mongoose.Promise = global.Promise; 

注意到,一個findOne返回文檔,而做一個find總是給你0或多個文檔的數組(S)

+0

這就是我正在做的 – diegoaguilar

+0

我需要在控制器上使用登錄功能,所以它確實需要返回* something *,這就是爲什麼我試圖返回promise。 即使進行了最後編輯,您的答案也是相同的,我已經在做 – diegoaguilar

+1

爲了清晰起見,我加入了回覆後表示同意。 @diegoaguilar如果您正在打電話,您不希望在FindOne呼叫前返回。 –

-2

login(email,password){ 
 
    return new Promise(function(resolve,reject){ 
 
     Account.findOne({email: email}).then(function (user) { 
 
      user.match = user.validPassword(password); 
 
      resolve(user) 
 
     }); 
 

 
    }) 
 
}

+0

我試過,但得到了相同的不想要的結果 – diegoaguilar

+0

diegoaguilar,這應該是工作。什麼是不想要的結果?這是否包裹在登錄功能正確? – uptownhr

相關問題