2012-12-30 237 views
6

我正在從貓鼬/ q承諾框架示例here,但似乎有一些問題與nfbind時,試圖使用findOne,主要是因爲從Q框架樣本似乎不匹配要點。貓鼬和q承諾

我的代碼:

var mongoose = require('mongoose'); 
var Q = require('q'); 

var user_schema = mongoose.Schema({username:String, last_touched:Date, app_ids:[String]}); 
var user = mongoose.model('user', user_schema); 

exports.user = user; 
exports.user.find = Q.nfbind(user.find); 
exports.user.findOne = Q.nfbind(user.findOne); 

如果我打電話user.findOne({username:'test'}).then(function(err, user) { ... },用戶永遠是不確定的。如果我刪除導出並使用帶回調的非諾言版本,我會得到該用戶。我錯過了一些特殊的魔法,但是在看了代碼實現之後,來自Q github和貓鼬演示的例子......沒有什麼真正跳出來的。任何想法如何讓我的findOne與Q一起工作?

我也試圖設置nfbind功能在源而不是在模塊中,但無濟於事。

+0

檢查也是這個答案http://stackoverflow.com/questions/11912573/node-js-deferred-promisify-mongoose/11931908 –

回答

5

因爲你nfbinding的方法是user對象的方法,你需要將它們傳遞給nfbind,這樣調用的時候,this指針保存前將其bind到該對象。

這種方式爲我工作:

exports.user.find = Q.nfbind(user.find.bind(user)); 
exports.user.findOne = Q.nfbind(user.findOne.bind(user)); 
+0

試過到 - 甚至出口作爲'searchByUsername'來確保它不是名稱上的衝突。仍然得到同樣的東西: 來自MongoDB的用戶:undefined – mlaccetti

+1

原來我是一個邪惡的asshat,並混合了一些想法:'user.findOne({'steam_username':username})。then(function(err,dbUser){ ...})' 簡單地刪除了'err'(呃,這就是失敗的原因),我們跑到了比賽。杜爾! – mlaccetti

+0

https://github.com/iolo/mongoose-q –