2012-12-30 14 views
6

je travaille de la mangouste/q promesses cadre échantillon here, mais semblent avoir quelques problèmes avec la nfbind en essayant d'utiliser findOne, principalement car les échantillons du cadre Q ne semblent pas correspondre ceux dans l'essentiel.Mongoose et q promesses

Mon code:

var mongoose = require('mongoose'); 
var Q = require('q'); 

var user_schema = mongoose.Schema({username:String, last_touched:Date, app_ids:[String]}); 
var user = mongoose.model('user', user_schema); 

exports.user = user; 
exports.user.find = Q.nfbind(user.find); 
exports.user.findOne = Q.nfbind(user.findOne); 

Si je l'appelle user.findOne({username:'test'}).then(function(err, user) { ... }, l'utilisateur est toujours défini. Si je supprime l'exportation et utilise la version non promise avec des rappels, j'obtiens l'utilisateur. Il me manque un peu de magie spéciale, mais après avoir regardé l'implémentation du code, l'exemple du Q github, et de la démo mongoose ... Rien ne saute vraiment. Des idées sur la façon dont je peux faire un findOne travailler avec Q?

J'ai également essayé de régler les fonctions nfbind dans la source plutôt que dans le module, mais en vain.

+0

Vérifiez également cette réponse http://stackoverflow.com/questions/11912573/node-js-deferred-promisify-mongoose/11931908 –

Répondre

5

Parce que les méthodes que vous avez nfbinding sont des méthodes de l'objet user, vous devez les bind à cet objet avant de les transmettre à nfbind afin que le pointeur this est conservé lorsqu'il est appelé.

Cette approche a fonctionné pour moi:

exports.user.find = Q.nfbind(user.find.bind(user)); 
exports.user.findOne = Q.nfbind(user.findOne.bind(user)); 
+0

essayé à - même exporté comme 'searchByUsername' pour s'assurer qu'il n'y avait pas de conflit dans les noms. Toujours obtenir la même chose: Utilisateur de MongoDB: undefined – mlaccetti

+1

Il s'avère que je suis un asshat méchant et mélangeait des idées: 'user.findOne ({'steam_username': nom d'utilisateur}). Then (function (err, dbUser) { ...}) ' Il suffit de supprimer le' err' (duh, c'est ce que le .fail est pour), et nous étions partis pour les courses. Durr! – mlaccetti

+0

https://github.com/iolo/mongoose-q –

Questions connexes