如何使用promises(Q包)实现这一目标?

时间:2015-07-21 06:52:39

标签: javascript node.js mongodb express q

我正在使用express.js和mongodb开发一个应用程序。 我想做以下任务。 如果数据库可用,那么我想获取所有帖子,否则会引发错误.. 我正在使用 Q包进行承诺。我不知道如何使下面的代码工作..如果有任何其他方法来实现这一点,那么帮助我。

function getAllPosts(){

    var deferred = Q.defer();

    db.connectDB().then(function(){ 

    db.posts.find({},function(err,data){

        if(err){
            deferred.reject(new Error('problem'));
        }else{
            deferred.resolve(data);
        }
    });

    }).fail(function(err){
        console.log(err);
    });

    return deferred.promise;
}

以下是我的路线 localhost:3000 / posts

的代码
exports.posts = function(req,res){
  postModel.getAllPosts().then(function(data){
    res.send(data);
  }).fail(function(err){
    res.send('error');
  });
}

这是我的mongodb连接代码

function connectDB(){
    mongoose.connect('mongodb://localhost/demo');
        var deferred = q.defer();
    mongoose.connection.on('open',function(){
        createTables();
        deferred.resolve();
    });

    mongoose.connection.on('error',function(){

        deferred.reject(new Error('Error connecting database'));
    });

    return deferred.promise;
}

1 个答案:

答案 0 :(得分:0)

我认为问题出在您的connection方法中,因为您没有使用大写字母Q来实例化延迟对象。

你应该使用

var deferred = Q.defer();

而不是

var deferred = q.defer();

所以你的连接方法应该是这样的:

function connectDB(){
    mongoose.connect('mongodb://localhost/demo');
    var deferred = Q.defer(); // Q with capital letter
    mongoose.connection.on('open',function(){
        createTables();
        deferred.resolve();
    });

    mongoose.connection.on('error',function(){

        deferred.reject(new Error('Error connecting database'));
    });

    return deferred.promise;
}