0

有没有人使用过nodejs模块'deferred'和'mongoose'?我试图让 deferred.promisify 方法处理猫鼬模型的功能,这样我就可以轻松地将它们链接起来,但遇到了一些麻烦。具体来说,我想承诺findandfindById函数,以便我可以通过 ObjectID 链接查找另一个文档引用的一个文档。

这就是我所拥有的:https ://gist.github.com/3321827

然而,这似乎不太理想,因为getAppPermissionsandgetApplication函数似乎只是 mongoose 模型的findandfindById方法的包装器。

我尝试仅将函数传递给 promisify,但我得到一个错误,Object #<Object> has no method '_applyNamedScope'这似乎是由于this不再绑定到正确的对象而导致的。也许我需要使用 underscore.bind?有没有人在这方面取得任何成功,还是我应该坚持现在的工作?

4

2 回答 2

2

Mariusz 的回答非常接近。在这种特殊情况下,这最终对我有用,希望其他人可以从中学习:

// I put this in my model file so I didn't have to worry about repeating it
var userProto = mongoose.model('User');

userProto.pFind = deferred.promisify(userProto.find);
userProto.pFindOne = deferred.promisify(userProto.findOne);
于 2012-08-18T05:40:04.233 回答
2

您可能没有正确地将上下文传递给方法,正确的方法是直接在 Mongoose 原型上提供方法的承诺版本:

// I assume that methods you're using are set on mongoose.Model,
// but be sure to check, maybe, they're using some other prototype (!)
var promisify = require('deferred').promisify;
var modelProto = mongoose.Model.prototype;
modelProto.pFind = promisify(modelProto.find);
modelProto.pFindById = promisify(modelProto.findById);

// After that you may use promisified methods directly:
app.get('/apps', requireLogin, function (req, res) {    
  AppPermissions.pFind({ user: req.user.id, valid: true })
    .map(function (permission) {
      return ApplicationRecord.pFindById(permission.application)(
        function (application) {
          application.permission = permisson;
          return application;
        }
      );
    }).end(function (applications) {
      res.render('applist', { applications: applications });
    }, null);
});

您还可以避免污染原型,并间接使用方法:

var promisify = require('deferred').promisify;
var modelProto = mongoose.Model.prototype;
var pFind = promisify(modelProto.find);
var pFindById = promisify(modelProto.findById);

app.get('/apps', requireLogin, function (req, res) {    
  pFind.call(AppPermissions, { user: req.user.id, valid: true })
    .map(function (permission) {
      return pFindById.call(ApplicationRecord, permission.application)(
        function (application) {
          application.permission = permisson;
          return application;
        }
      );
    }).end(function (applications) {
      res.render('applist', { applications: applications });
    }, null);
});
于 2012-08-13T09:53:45.857 回答