2012-12-30 64 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 –