【问题标题】:mongoose and q promises猫鼬和 q 承诺
【发布时间】: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 函数,但无济于事。

【问题讨论】:

标签: node.js mongoose deferred promise q


【解决方案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 的用途),我们就参加了比赛。杜尔!
猜你喜欢
  • 2015-05-12
  • 2019-09-19
  • 2015-10-27
  • 1970-01-01
  • 2017-07-10
  • 2017-06-15
  • 2019-06-04
  • 2017-08-18
  • 2018-02-15
相关资源
最近更新 更多