Node js错误处理使服务器崩溃

时间:2019-02-13 15:08:40

标签: node.js

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");
        }
    });
});

如果我忘记输入密码,服务器将崩溃该如何处理

3 个答案:

答案 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);

希望它对您有用。