我怎样才能用“Q`与mongoose绑定`save`方法

说我在User.js有以下模式

 var mongoose = require('mongoose'); var Q = require('q'); var userSchema = new mongoose.Schema({ phone: { type: Number, require: true, index: { unique: true } } }); module.exports = mongoose.model('User', userSchema); module.exports.findOne = Q.nfbind(module.exports.findOne.bind(module.exports)); module.exports.find = Q.nfbind(module.exports.find.bind(module.exports)); 

另一个文件testuser.js

 var mongoose = require('mongoose'); var Q = require('q'); var User = require('../User'); var connectionStr = "mongodb://localhost:27017/user-model-test"; mongoose.connect(connectionStr, function(error) { if (error) { throw(error); } console.log("Connect to MongoDB..."); var testuser = new User({ phone: 1008611, }); testuser.save = Q.nfbind(testuser.save.bind(testuser)); testuser.save().then(function () { return User.findOne({ phone: 1008611 }).then(function (user) { console.log(user.phone); mongoose.disconnect(); }, function (error) { throw(error); }); }, function (error) { throw(error); }).done(); }); 

请注意,目前我使用testuser.save = Q.nfbind(testuser.save.bind(testuser)); 绑定save ,但我想在User.js做,如module.exports.find = Q.nfbind(module.exports.find.bind(module.exports)); 有什么办法可以做到吗?

谢谢。

如果你坚持Q,我会这样做:

 User.create = function(data){ var u = new User(data); u.save = Q.nfbind(testuser.save.bind(testuser)); // add other methods you want return u; }; 

但是,我想补充说,所有其他的Mongoose方法已经返回一个承诺,如果你调用.exec()对他们(所以.find(..).exec()返回一个mpromise承诺)。 也就是说,Mongoose已经提供了一个promise API, save是目前还没有包含的唯一方法之一, 并且有计划包含它 。

知道这与Bluebird有一个promisifyAll ,它有一个promisifyAll函数,可以创build比Qs或Mongoose更容易debugging并且更快的promise。