2014-05-16 59 views
1

說,我有User.js怎麼能使用`Q`與貓鼬

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`方法綁定save,但我想在User.js中做,如module.exports.find = Q.nfbind(module.exports.find.bind(module.exports));,有沒有什麼辦法可以做到這一點?

謝謝。

回答

3

如果你堅持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; 
}; 

不過,我想補充一點,所有其他貓鼬方法已返回一個承諾,如果你打電話.exec()他們(這樣.find(..).exec()返回一個mpromise諾言)。也就是說,貓鼬已經提供了承諾API,save是未包括的唯一方法之一and there are plans to include it

這也是有益的知道,這將成爲一個與藍鳥,其中有一個promisifyAll功能,創建更容易調試,並比Qs或Mongoose更快的承諾。