刷新时:发送到客户端后无法设置 headers

On Refresh: Cannot set headers after they are sent to the client

我正在尝试创建一个 API 端点来验证给定电子邮件和密码参数的用户以及 returns 对身份验证成功的 JSON 响应。但每次我调用同一个端点两次(通过刷新或从同一页面调用它两次),我得到: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client.

我在网上查看并找到了几个解决方案来删除 res.send 冗余或使用 res.json。 None 其中有效果。

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

我期待一个成功的回应,但我一直收到错误。任何和所有的帮助表示赞赏。谢谢。

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

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

您需要添加 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'
                    })
                }
            }
        });
    })