【发布时间】:2019-07-19 15:54:07
【问题描述】:
我正在尝试创建一个 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'
})
}
}
});
})
});
我期待一个成功的响应,但我不断收到错误消息。任何和所有的帮助表示赞赏。谢谢。
【问题讨论】:
-
我之前遇到过这样的问题 - 这是一个承诺问题,您的代码向客户端发送了两次响应
-
它可能在 con.connect 中注册了一个错误,然后仍然继续 con.query。如果你返回 res.send,你可能会有更多的运气,然后函数将终止。
-
可以在endpoint里只有一个res.send吗?
-
@HanWang 你只能有一个 res.send 执行。你可以有多个条件。
-
@CalIrvine 有效。非常感谢!