NODE JS中的错误处理
这是我的登录功能
router.post('/admin/login', function (req, res) {
User.findOne({ username: req.body.username }, function (err, user) {
if (err) return res.status(500).send('Error on the server.');
if (!user) return res.status(404).send('No user found.');
var passwordIsValid = bcrypt.compareSync(req.body.password, user.password);
if (!passwordIsValid) return res.status(401).send({ auth: false, token: null });
if (req.body.username && req.body.password) {
console.log("enter");
var token = jwt.sign({ id: user._id }, config.secret, {
expiresIn: 86400 // expires in 24 hours
});
res.status(200).send({ auth: true, token: token });
} else {
return res.status(500).send('Error on the server.');
//res.status(500).send("Check Username & Password");
}
});
});
如果我忘记输入密码,服务器将崩溃该如何处理
答案 0 :(得分:0)
在将密码传递到compareSync
函数之前,您需要检查密码是否已传递。
if (!req.body.password) {
// handle error
return res.status(401).send("Missing or invalid password")
}
如果要执行此操作,还应该检查发布请求中是否提供了req.body.username
。另外,为方便起见,您可以在查询周围加上try catch
来处理其他意外错误。
答案 1 :(得分:0)
最好在前端(客户端)中进行检查,并在后端中检查电子邮件和密码,这里有很多库可以做到这一点,例如,我使用express-validator lib进行简单检查,当然,您可以阅读完整的文档https://express-validator.github.io/docs/
代码示例:
const { check, validationResult, body } = require('express-validator/check');
router.post('/admin/login',[check('email').isEmail(),check('password').isLength({ min: 5 })], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(422).json({ errors: errors.array() });
}
// the rest of your sing in code here
})
您也可以检查名称长度,这对于后端来说更安全。请始终在前端和后端检查验证,永远不要只信任客户端,在后端进行自己的验证,我希望这个回答你的问题
答案 2 :(得分:0)
我在使用非常相似的代码时遇到了同样的问题。 我替换了这一行:
(...)
if (!user) return res.status(404).send('No user found.');
为此:
User.findOne({username : req.body.username},function(err, user){
if(err){
return res.status(401).json({message : err})
};
/* Trying to repair error when username is not on DB */
if(user === null) {
return res.status(401).json({auth : false, token : null, message : "Not Authorised User"});
};
/* Replacement worked */
var isPasswordValid = bcrypt.compareSync(req.body.password, user.password);
希望它对您有用。