我正在尝试创建一个API端点,该端点对给定电子邮件和密码参数的用户进行身份验证,并在身份验证成功后返回JSON响应。但是每次我两次调用同一个端点(通过两次刷新或从同一页面调用它),都会得到:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client.
我在网上查看了一些解决方案,以删除res.send冗余或使用res.json。他们都没有工作。
app.get('/api/login', (req, res) => {
let email = req.query.email;
let password = req.query.password;
con.connect(err => {
if (err) {
res.send({
success: false,
message: 'connection error'
})
}
con.query(`SELECT * FROM users WHERE email='${email}'`, (err) => {
if (result.length === 0) {
res.send({
success: false,
message: 'account does not exist'
})
} else {
if (bcrypt.compareSync(password, result[0].password)) {
res.redirect('/dashboard')
} else {
res.send({
success: false,
message: 'incorrect password'
})
}
}
});
})
});
我期望得到成功的答复,但是我不断收到错误消息。任何和所有帮助表示赞赏。谢谢。
答案 0 :(得分:1)
该错误是由于尝试向一个特定请求发送多个响应而引起的。在为该特定请求处理程序显示的代码中,我看到了一个可以执行此操作的地方。
如果连接时出错,则进行测试并发送错误响应,但是您没有返回,因此请求处理程序继续进入处理程序的其余部分,然后尝试发送另一个响应。
您需要添加return
或else
,以便在发生连接错误时,代码不会流入处理程序的其余部分。
app.get('/api/login', (req, res) => {
let email = req.query.email;
let password = req.query.password;
con.connect(err => {
if (err) {
res.send({
success: false,
message: 'connection error'
})
return;
}
con.query(`SELECT * FROM users WHERE email='${email}'`, (err) => {
if (result.length === 0) {
res.send({
success: false,
message: 'account does not exist'
})
} else {
if (bcrypt.compareSync(password, result[0].password)) {
res.redirect('/dashboard')
} else {
res.send({
success: false,
message: 'incorrect password'
})
}
}
});
})