【问题标题】:On Refresh: Cannot set headers after they are sent to the client刷新时:在将标头发送到客户端后无法设置标头
【发布时间】: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 有效。非常感谢!

标签: node.js express endpoint


【解决方案1】:

该错误是由于尝试向特定请求发送多个响应而导致的。在您为这个特定请求处理程序显示的代码中,我看到了您可以这样做的地方。

如果您在连接时遇到错误,则进行测试并发送错误响应,但您不返回,因此请求处理程序继续进入处理程序的其余部分,然后将尝试发送另一个响应。

您需要添加returnelse,这样如果出现连接错误,代码就不会流入处理程序的其余部分。

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'
                    })
                }
            }
        });
    })

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 2021-06-18
    • 2022-01-14
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多