刷新时:将标头发送到客户端后无法设置标头

时间:2019-07-19 15:54:07

标签: node.js express endpoint

我正在尝试创建一个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'
                    })
                }
            }
        });
    })
});

我期望得到成功的答复,但是我不断收到错误消息。任何和所有帮助表示赞赏。谢谢。

1 个答案:

答案 0 :(得分: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'
                    })
                }
            }
        });
    })