You probably didnβt pass the context correctly to the methods, the right way to do this is to provide promising versions of the methods directly on the prototype of 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); });
You can also refrain from contaminating the prototype and use methods indirectly:
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); });
source share