错误 [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(...)
.
尝试在我的 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(...)
.