猫鼬和 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 承诺的主要内容,如果未能解决你的问题,请参考以下文章

带有 Q 承诺的 Node.JS 猫鼬请求返回空

猫鼬承诺永远不会到达 .then()

猫鼬批量保存承诺

无法操纵 mongoose 查询结果 - 承诺未定义

Mongoose.create + Q 将 mongoose 承诺转换为 Q 承诺

猫鼬承诺文档说查询不是承诺?