2015-06-02 103 views
0

我有這個代碼的問題如何使用Node.js承諾不執行使用鏈接承諾Node.js的

顯然沒有被執行以下承諾:

return bloguers.replaceOne({id: bloguer.id}, bloguer,{upsert:true}, function (err){ 
         console.log(err); 
         res.status(400).end(); 
        }); 

這裏的其餘功能:

.post(function (req,res){ 
       var bloguers = db.collection('bloguers'); 
       var bloguer = req.body; 
       console.log(bloguer.id); 
       bloguers.findOne({id: bloguer.id}).then(function (respon){ 
        if(respon != null){ 
         console.log('dentro if'); 
         return bloguers.replaceOne({id: bloguer.id}, bloguer,{upsert:true}, function (err){ 
          console.log(err); 
          res.status(400).end(); 
         }); 
        } 
        else{ 
         return bloguers.insertOne(bloguer).then(function (r){ 

         }, function (err) { 
          console.log(err); 
          res.status(400).end(); 
         }); 
        } 
       }).then(function(r){ 
        res.json(r); 
       }) 
      }); 

您可以看到console.log('dentro if')被執行,但承諾不是。

回答

0

如果replaceOne確實返回承諾,那麼您可能不應該將回調傳遞給它。

更改此:

return bloguers.replaceOne({id: bloguer.id}, bloguer,{upsert:true}, function (err){ 
    console.log(err); 
    res.status(400).end(); 
}); 

要這樣:

return bloguers.replaceOne({id: bloguer.id}, bloguer,{upsert:true}) 
    .then(function() { 
    res.status(400).end(); 
    }) 
    .catch(function (err) { 
    console.log(err); 
    }); 

我不熟悉您使用的API(?本機MongoDB的驅動程序),但如果API已經支持的承諾,然後如果它檢測到你傳遞了回調,它可能不會返回一個承諾。

+0

事實上,我使用的是MongoDB驅動程序,它確實會返回一個承諾。然而,我試過你的代碼,但仍然諾言是正在執行的筆記(試圖把一個控制檯日誌裏面.then()。 – LucasMesquita