2012-08-11 8 views
0

Est-ce que quelqu'un a travaillé avec les modules nodejs 'différés' et 'mongoose'? J'essaie d'obtenir la méthode deferred.promisify pour travailler sur les fonctions des mangues mongoose, donc je peux les enchaîner facilement, mais je rencontre des problèmes. Spécifiquement, je voudrais promisify les fonctions find et findById ainsi je peux enchaîner trouver un document référencé par un autre document par ObjectID.Node.js différé promisify + mongoose

Voici ce que j'ai: https://gist.github.com/3321827

Cependant, cela semble moins idéal puisque les fonctions semblent getAppPermissions et getApplication être un peu plus que des emballages pour les méthodes find et findById du modèle mangouste.

J'ai essayé juste de passer les fonctions pour promisifier, mais j'obtiens une erreur au sujet de Object #<Object> has no method '_applyNamedScope' qui semble être provoqué parce que this n'est plus lié à l'objet correct. Peut-être que je dois utiliser underscore.bind? Est-ce que quelqu'un a eu du succès dans ce domaine, ou devrais-je m'en tenir à ce qui fonctionne maintenant?

+0

Node/V8 implémente 'Function.prototype.bind', de sorte que vous n'avez pas besoin de se lier de Souligné; par exemple, 'MyModel.find.bind (MyModel)'. –

Répondre

2

La réponse de Mariusz était assez proche. Voici ce qui a fini par travailler pour moi dans ce cas particulier, nous espérons que d'autres peuvent apprendre de ceci:

// 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); 
2

Vous avez sans doute pas passé le contexte des méthodes bien, bonne façon de le faire est de fournir des versions promisified des méthodes directement sur prototype 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); 
}); 

Vous pouvez également éviter de polluer le prototype et l'utilisation méthodes indirectement:

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); 
}); 
+0

Merci - ce n'est pas vraiment la réponse (voir ma propre réponse), mais cela m'a vraiment aidé à me mettre dans la bonne direction! –

+0

Votre réponse est vraiment la même chose, je ne savais pas trop comment arriver à l'objet * prototype * (n'a pas essayé d'exécuter le code). Quoi qu'il en soit, génial c'est résolu pour vous :) –

Questions connexes