错误 [ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置 headers - Node.Js、Express、Postgres

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client - Node.Js, Express, Postgres

尝试在我的 express .get('/users') 方法中检索所有用户时,我遇到了标题中的错误消息的问题。我正在使用 Node.js、Express 和 node-postgres。我有我的 getUsers(); 函数在我的 queries.js 文件中定义,我在我的 index.js 文件中的 app.get() 函数中调用该函数。

queries.js

const client = require('./object models/db_client_pool')
const Pool = require('pg').Pool
const pool = new Pool(client.client)

async function getUsers(request, response) {
    await pool.connect()
    pool.query('select * from discord_users', (error, results) => {
        if (error) {
            throw error
        }
        response.sendStatus(200).json(results.rows)
        pool.release();

    })
}

module.exports = {
    getUsers
}

index.js

const express = require('express');
require('dotenv').config();
//const bodyParser = require('body-parser'); deprecated
const app = express();
const port = 3000;
const db = require('./queries');

app.use(express.json())

app.use(express.urlencoded({
    extended: true
}))

app.get('/', (request, response) => {
    response.json({ info: 'Node.js, Express, and Postgres API' })
})

app.get('/users', (req, res) => {
    db.getUsers(req, res)
})

app.listen(port, () => {
    console.log(`App is listening on port ${port}`);
});

正如我所说,我一直收到“在将它们发送到客户端后无法设置 headers”错误,我不知所措。预先感谢您的帮助!

所以我的猜测是,您 运行 表示 4.x 并且不再支持 response.sendStatus(200)。您必须改用 response.status(200)

现在,我在您的代码中看到的另一个问题是,我无法识别 pg 库中的 pool.release() 方法。您可以将客户端释放回池中,但不能释放客户端池。也许你的意思是 pool.end()?

由此变化:

response.sendStatus(200).json(results.rows)

对此:

response.status(200).json(results.rows);

甚至只是为了这个:

response.json(result.rows);    // 200 is the default status already

最后一个就好了,因为200已经是默认状态了,不用自己设置了。

问题是 response.sendStatus(200) 发送了一个完整的响应,主体为空,然后您尝试调用 response.json(result.rows),它试图向同一请求发送另一个响应。尝试向同一个请求发送第二个响应会触发您收到的错误消息。

response.status(200) 只是在等待响应对象上将状态设置为 200 作为 属性 并等待其他方法实际发送响应本身,然后您可以使用 .json(...).