Node.js 如何使用'Q'与mongoose绑定'save'方法

Node.js 如何使用'Q'与mongoose绑定'save'方法,node.js,mongoose,promise,q,Node.js,Mongoose,Promise,Q,说我在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', userSch

说我在
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));
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.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));
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))
绑定
保存
,但我想在
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是一个单行程序,Bluebird有一个
promisifyAll
函数,可以创建比Qs或Mongoose更容易调试、更快的承诺