我试图通过在帖子请求中获取用户名和密码来登录用户。我这样做是为了使每个用户都有唯一的用户名。但是当我尝试通过将请求中的密码与请求中的密码进行比较来检查用户是否输入了正确的密码时,从数据库返回的哈希密码,因此如果它们匹配,我可以发送回令牌,但我收到此错误:非法参数:字符串,未定义。
这是代码:
router.post('/login', (req, res) => {
User.find({ username: req.body.username }, (err, data) => {
var passwordIsValid = bcrypt.compareSync(req.body.password, data.password);
if (err) return res.send(err);
if (data.length === 0 || !passwordIsValid) return res.json({ msg: "Invalid credentials." });
var token = jwt.sign({ id: user._id }, 'supersecret', {
expiresIn: 86400 // 24 hours
});
res.json({ auth: true, token: token });
});
});
答案 0 :(得分:0)
这里我不理解var token = jwt.sign({ id: user._id }, 'supersecret', {
的这段代码,user._id
来自哪里?此行中的更改应解决,如果成功,执行测试建议。
router.post('/login', (req, res) => {
User.find({ username: req.body.username }, (err, data) => {
var passwordIsValid = bcrypt.compareSync(req.body.password, data.password);
if (err) return res.send(err);
if (!passwordIsValid) return res.json({ msg: "Invalid credentials." });
var token = jwt.sign({ id: data._id }, 'supersecret', {
expiresIn: 86400 // 24 hours
});
res.json({ auth: true, token: token });
});
});
如果您希望使用异步/等待进行测试。
router.post('/login', async (req, res) => {
const user = await User.find({ username: req.body.username })
if(!user){
return res.send({Error: 'User does not exist'})
}
if(!await bcrypt.compare(req.body.password, user.password)){
return res.send({msg: 'Invalid credentials.'})
}
const token = jwt.sign({id: user._id}, 'supersecret',{
expiresIn: 86400
})
res.json({ auth: true, token: token });
});
后来我发现这个错误代替了user._id,它变成了data._id,但仍然无法正常工作,事实证明数据是一个对象数组,因为每个用户名都是唯一的,因此它总是只有一个对象来保存信息关于具有给定用户名的用户,因此为了访问用户密码,我需要写data [0] .password而不是data.password。