2015-07-21 55 views
0

我正在開發一個應用程序express.js和mongodb。 我想做以下任務。 如果數據庫可用,那麼我想獲取所有其他的帖子,它會拋出一個錯誤..我使用Q包承諾。我不知道如何使下面的代碼工作..如果有任何其他方式來實現這一點,然後幫助我。如何使用承諾(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; 
} 

這裏是我的路線本地主機代碼:3000 /職位

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; 
} 
+0

*話題*:有沒有專門使用'的要求Q'。如果沒有,只需使用節點v0.12和'--harmony'標誌來使用promise。 –

+0

第一眼看起來代碼是好的。你有什麼樣的錯誤? –

+0

@SimoEndre當mongodb沒有連接時,我可以得到錯誤信息。但是,當我啓動MongoDB並切換到URL本地主機:3000 /職位(這是假設返回所有帖子),它不是返回數據..它只是繼續加載... – kishan

回答

0

我認爲這個問題是在你的connection方法,因爲您沒有用大寫字母實例化延遲對象。

您應該使用

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; 
} 
+0

已經嘗試過了..我想這不是問題所在。 – kishan

+0

如果你沒有承諾嘗試它是否工作?如果你控制'data',你會得到一些數據嗎? –

+0

是的。沒有承諾它會記錄數據。 – kishan