猫鼬和 q 承诺
Posted
技术标签:
【中文标题】猫鼬和 q 承诺【英文标题】:mongoose and q promises 【发布时间】:2012-12-14 20:01:39 【问题描述】:我正在使用 mongoose/q promises 框架示例 here,但在尝试使用 findOne 时似乎遇到了一些 nfbind 问题,主要是因为来自 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 的示例以及来自 mongoose 演示的示例之后......没有什么真正跳出来的。关于如何让findOne
与 Q 一起工作的任何想法?
我也尝试在源代码而不是模块中设置nfbind
函数,但无济于事。
【问题讨论】:
检查这个答案***.com/questions/11912573/… 【参考方案1】:由于您要 nfbinding 的方法是 user
对象的方法,因此您需要先将它们 bind
传递给该对象,然后再将它们传递给 nfbind
,以便在调用时保留 this
指针。
这种方法对我有用:
exports.user.find = Q.nfbind(user.find.bind(user));
exports.user.findOne = Q.nfbind(user.findOne.bind(user));
【讨论】:
试过了 - 甚至导出为searchByUsername
以确保它不是名称冲突。仍然得到相同的东西:来自 MongoDB 的用户:未定义
原来我是个混蛋,正在混合想法:user.findOne('steam_username':username).then(function (err, dbUser) ... )
简单地删除了err
(呃,这就是 .fail 的用途),我们就参加了比赛。杜尔!以上是关于猫鼬和 q 承诺的主要内容,如果未能解决你的问题,请参考以下文章