【发布时间】:2021-10-07 07:35:26
【问题描述】:
我正在使用 Nodejs 和 MySQL 来验证用户密码。我很难访问我的响应 (res) 对象以将响应发送回客户端。出于某种原因,它在我的 bcrypt 函数之上工作,但不在下面。我需要在下面访问它,以便我可以将我的 JWT 令牌发送回客户端。请参阅下面的代码示例。谢谢。
**WORKING EXAMPLE**
**res.send(data) is properly sending data back to the client**
app.post("/login", jsonParser,(req, res) => {
let selectQuery = 'SELECT * FROM ?? WHERE ?? = ?';
let query = mysql.format(selectQuery,["users","username", req.body.username]);
pool.query(query,(err, data) => {
if(err) {
console.error(err);
}
//works here---> res.send(data)
let match = bcrypt.compareSync(req.body.password,
data[0].password)
console.log(match)
match ? token = generateToken(data[0]): token = null
})
})
**NON-WORKING EXAMPLE**
**res.send(data) is NOT sending data back to the client. TIMED OUT**
app.post("/login", jsonParser,(req, res) => {
let selectQuery = 'SELECT * FROM ?? WHERE ?? = ?';
let query = mysql.format(selectQuery,["users","username", req.body.username]);
pool.query(query,(err, data) => {
if(err) {
console.error(err);
}
let match = bcrypt.compareSync(req.body.password, data[0].password)
console.log(match)
//not here----> res.send(data)
match ? token = generateToken(data[0]): token = null
})
})
**The same code using try catch**
app.post("/login", jsonParser,(req, res) => {
let selectQuery = 'SELECT * FROM ?? WHERE ?? = ?';
let query = mysql.format(selectQuery,["users","username", req.body.username]);
pool.query(query,(err, data) => {
if(err) {
console.error(err);
}
try {
let match = bcrypt.compareSync(req.body.password, data[0].password)
match ? token = generateToken(data[0]): token = null
}
catch (exception_var) {
console.log('exception', exception_var)
}
finally {
res.send(token)
}
})
})
function generateToken(data) {
const secret = process.env.JWT_SECRET;
console.log('inside generate token!', data)
const payload = {
data: data.username,
//department: data.department,
subject: data.id,
};
console.log(payload,'payload')
const options = {
expiresIn: "1d",
};
return jwt.sign(payload, secret, options);
}
【问题讨论】:
-
嗨!欢迎来到stackoverflow!几个问题:
compare()返回什么?你可以在最后 3 行周围添加一个 try-catch 块吗?我认为它抛出了一个错误,并且响应永远不会发回 -
@germanio 嗨,谢谢!我已经更新了上面的代码,使其更具可读性。我的比较同步函数使用正确的密码返回 true,使用不正确的密码返回 false。我添加了 try catch 但它没有抛出任何错误,它仍然不会发送响应。它可以很好地验证我的密码并生成令牌,但不会发送任何类型的响应。谢谢。
标签: mysql node.js api express scope