我通过 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.password
为 undefined
时,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/