2015-06-02 57 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