おそらく、コンテキストをメソッドに適切に渡していない可能性があります。これを行う正しい方法は、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);
});