不能在同一个Web请求中使用Mongoskin两次(NodeJS)

时间:2014-06-09 06:49:39

标签: node.js mongodb openshift mongoskin

出于某种原因,我无法在node.js中的Web请求期间多次查询MongoDB。用户名验证和电子邮件验证两者都可以自行完成,但不能连续完成。如果我注释掉其中一个代码段,则该函数可以按需运行。如果我将两个部分都留下,我在Openshift服务器上运行请求时会遇到502代理错误。当我将多个Mongo查询放入单个请求(不仅仅是验证)时,我实际上总是得到502。有什么办法可以解决这个问题吗?我应该使用某种异步调用吗?

router.post('/login', function(req, res) {
  var db = req.db;
  userVerify(req, res);
  //VERIFY BY USERNAME
  db.collection('userlist').findOne({'username': req.body.username}, function (err, item){
      if(item.username == req.body.username)
      {
        if(passwordGen.verify(req.body.password, item.password)==true)
        {
          //res.render('logged_in.html', {});
          res.send( {msg: 'success'} )
        }
      }
    });
  //VERIFY BY EMAIL    
  db.collection('userlist').findOne({'email': req.body.username}, function (err, item){
    if(item.email == req.body.username)
    {
      if(passwordGen.verify(req.body.password, item.password)==true)
      {
        res.send( {msg: 'success'} );
      }
    }
  });
  //Return an error if the both failed.
  res.send( {msg: 'ERROR'} );
});

1 个答案:

答案 0 :(得分:0)

我认为你的问题很重要,因为它显示了在Node下使用MongoDB的一个非常基本的方面。

你已经得到了@Neil评论的答案。这些操作中的每一个都是异步的,不应并行运行。您当前的代码显示在查询数据库的两个线程之间的竞争,第一个回来,第一个调用res.send()并完成响应。

所以你需要做的就是将它们嵌套在另一个中:等待数据库响应以验证密码,然后开始验证电子邮件,完成后 - 响应调用者

HTH