0

nodejsモジュールの「deferred」と「mongoose」を使用した人はいますか?deferred.promisifyメソッドをマングースモデルの関数で機能させて、簡単にチェーンできるようにしようとしていますが、いくつかの問題が発生しています。具体的には、 ObjectIDによって別のドキュメントによって参照されている1つのドキュメントを連鎖的に検索できるように、findおよび関数を約束したいと思います。findById

これが私が持っているものです:https ://gist.github.com/3321827

getAppPermissionsただし、 and関数はマングースモデルのandメソッドのgetApplicationラッパーにすぎないように見えるため、これは理想的とは言えません。findfindById

約束する関数を渡そうとしましたが、正しいオブジェクトにバインドされていないObject #<Object> has no method '_applyNamedScope'ため、原因と思われるエラーが発生します。thisおそらく、underscore.bindを使用する必要がありますか?誰かがこの分野で成功したことがありますか、それとも私は今働いているものに固執する必要がありますか?

4

2 に答える 2

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 に答える
2

マリウスの答えはかなり近いものでした。これがこの特定のケースで私のために働いた結果です、うまくいけば他の人がこれから学ぶことができます:

// 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 に答える