[英]MongoDB + Express: How to verify login credentials using db.collection().findOne() or .find()?
我有一个POST请求,其中一个用户凭据作为登录页面中的对象,并被传递给API服务器,如下所示:
loginUser(creds) {
//creds is in the form of { username: bob, password: 123 }
var request = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(creds),
}
fetch(`http://localhost:3000/api/login`, request)
.then(res => res.json())
.then(user => {
console.log(user);
console.log('Successful')
})
.catch(err => {
console.log('Error is', err)
})
},
API Server会像这样接收它:
//With .findOne()
app.post('/api/login/', function(req, res) {
console.log('Req body in login ', req.body)
db.collection('users').findOne(req.body, function(err, isMatch) {
console.log('ISMATCH IS: ' + isMatch)
if(err) {
console.log('THIS IS ERROR RESPONSE')
res.json(err)
} else {
console.log('THIS IS ISMATCH RESPONSE')
res.json(isMatch)
}
})
})
要么
//With .find()
app.post('/api/login/', function(req, res) {
console.log('Req body in login ', req.body)
//console logs correctly as { username: bob, password: 123 }
db.collection('users').find(req.body).next(function(err, isMatch) {
console.log('ISMATCH IS: ' + isMatch)
if(err) {
console.log('THIS IS ERROR RESPONSE')
res.json(err)
} else {
console.log('THIS IS ISMATCH RESPONSE')
res.json(isMatch)
}
})
})
因此,使用传入的登录凭据,在API服务器内部,我想搜索我的'users'
数据库以查看是否与传入'users'
数据库匹配。但在这两种情况下, isMatch
始终为null
并始终记录console.log('THIS IS ISMATCH RESPONSE')
即使用户凭据与数据库中的任何凭据不匹配, console.log('THIS IS ISMATCH RESPONSE')
。 在客户端,我从来没有得到任何错误响应,并始终记录console.log('Successful')
。
似乎无法弄清楚我错过了什么。 我能做错什么?
谢谢
我建议你先找到用户,然后比较密码,例如:
db.collection('users').findOne({ username: req.body.username}, function(err, user) {
console.log('User found ');
// In case the user not found
if(err) {
console.log('THIS IS ERROR RESPONSE')
res.json(err)
}
if (user && user.password === req.body.password){
console.log('User and password is correct')
res.json(user);
} else {
console.log("Credentials wrong");
res.json({data: "Login invalid"});
}
});
您应该在.findOne()方法中使用$和Operator 。
工作范例:
db.collection('users').findOne(
{ $and: [
{ name: req.body.username.toLowerCase() },
{ password: req.body.password }
] },
(err, result) => {
if(err) {
res.status(500).send(err);
return;
}
if(!result) {
data = {
"meta": {
"status": "fail",
"message": "Login Failure: Invalid username or password"
}
};
res.status(401).send(data);
} else {
data = {
"meta": {
"status": "success",
"message": "Login success"
}
};
res.json(data);
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.