javascript - POST 正文未定义导致 Node.js 服务器关闭

标签 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, 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 请求时,req.body.email 返回 undefined 并且 mongoose 会找到数据库中的第一个用户(没有电子邮件验证)。

这很好,因为它随后会检查密码并返回错误消息。问题是,当 req.body.passwordundefined 时,bcrypt.compareSync 返回错误,并导致 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!'});
                }
            }
        });
    }
}

关于javascript - POST 正文未定义导致 Node.js 服务器关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32151497/

相关文章:

javascript - PubNub channelGroup.forEach 不是函数

javascript - Google Maps Api v3 触发器问题,外部链接命中信息窗口

node.js - sails 中的 Node js Passport-Facebook 策略身份验证

linux - ( Node )达到最大文件限制?

javascript - Node : One Global EventEmitter or every module it's own?

jquery - 双 jQuery 延迟() 的问题

javascript - 如果从日历中选择给定值,如何触发 jquery 事件

javascript - 图像或 pdf 的文件输入验证

http - 在 Google App Engine 日志中查看 POST 请求的参数

java - 将 JSON POST 到服务器并接收响应