Javascript POST body未定义导致node.js服务器关闭

Javascript POST body未定义导致node.js服务器关闭,javascript,node.js,post,express,body-parser,Javascript,Node.js,Post,Express,Body Parser,我通过POST将用户名和密码发送到/user/login路由上的Node.js API。这就是功能: module.exports.login = function(req, res) { User.findOne({email: req.body.email}, function(err, user) { if(err) throw err; if(!user) { res.json({success: false, messa

我通过POST将用户名和密码发送到/user/login路由上的Node.js API。这就是功能:

module.exports.login = function(req, res) {
    User.findOne({email: req.body.email}, function(err, user) {
        if(err) throw err;

        if(!user) {
            res.json({success: false, message: 'Invalid username or password!'});
        } else {
            if(!bcrypt.compareSync(req.body.password, user.password)) {
                res.json({success: false, message: 'Invalid username or password!'});
            } else {
                var token = jwt.sign(user, config.secret, {
                    expiresInMinutes: 1440
                });

                res.json({success: true, token: new Buffer(token).toString('base64')});
            }
        }
    });
}
为了获得post body变量,我使用body解析器模块。每当我在没有电子邮件的情况下发送POST请求时,
req.body.email
返回
undefined
,mongoose在数据库中找到第一个用户(没有电子邮件验证)

这很好,因为它会检查密码并返回错误消息。问题是,
bcrypt.compareSync
req.body.password
undefined
时返回错误,并导致node.js崩溃,如下所示:

throw Error("Illegal arguments: "+(typeof s)+', '+(typeof hash));
Error: Illegal arguments: undefined, string

我可以先检查变量是否未定义,但必须有更好的方法来解决此问题?

如果电子邮件未定义,则不应执行登录功能的任何部分-如果自动选择数据库中的第一封电子邮件,则会出现严重的安全漏洞。在传递给API函数之前检查值是否已定义实际上是处理问题的最佳方法。尝试:

module.exports.login = function(req, res) {
    if (req.body.hasOwnProperty('email') && req.body.hasOwnProperty('password')) {
        User.findOne({email: req.body.email}, function(err, user) {
            if(err) throw err;
            if(!user) {
                res.json({success: false, message: 'Invalid username or password!'});
            } else {
                if(bcrypt.compareSync(req.body.password, user.password)) {
                    var token = jwt.sign(user, config.secret, {
                        expiresInMinutes: 1440
                    });
                    res.json({success: true, token: new Buffer(token).toString('base64')});
                } else {
                    res.json({success: false, message: 'Invalid username or password!'});
                }
            }
        });
    }
}

如果电子邮件未定义,则不应执行登录功能的任何部分-如果自动选择数据库中的第一封电子邮件,则会出现严重的安全漏洞。在传递给API函数之前检查值是否已定义实际上是处理问题的最佳方法。尝试:

module.exports.login = function(req, res) {
    if (req.body.hasOwnProperty('email') && req.body.hasOwnProperty('password')) {
        User.findOne({email: req.body.email}, function(err, user) {
            if(err) throw err;
            if(!user) {
                res.json({success: false, message: 'Invalid username or password!'});
            } else {
                if(bcrypt.compareSync(req.body.password, user.password)) {
                    var token = jwt.sign(user, config.secret, {
                        expiresInMinutes: 1440
                    });
                    res.json({success: true, token: new Buffer(token).toString('base64')});
                } else {
                    res.json({success: false, message: 'Invalid username or password!'});
                }
            }
        });
    }
}

实际上我已经在用js typeof做了。不知道自己的财产。谢谢。实际上我已经在用js typeof做了。不知道自己的财产。非常感谢。