出于某种原因,我无法在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'} );
});
答案 0 :(得分:0)
我认为你的问题很重要,因为它显示了在Node下使用MongoDB的一个非常基本的方面。
你已经得到了@Neil评论的答案。这些操作中的每一个都是异步的,不应并行运行。您当前的代码显示在查询数据库的两个线程之间的竞争,第一个回来,第一个调用res.send()并完成响应。
所以你需要做的就是将它们嵌套在另一个中:等待数据库响应以验证密码,然后开始验证电子邮件,完成后 - 响应调用者
HTH