ERR_HTTP_HEADERS_SENT:在 ServerResponse 将标头发送到客户端后无法设置标头
Posted
技术标签:
【中文标题】ERR_HTTP_HEADERS_SENT:在 ServerResponse 将标头发送到客户端后无法设置标头【英文标题】:ERR_HTTP_HEADERS_SENT: Cannot set headers after they are sent to the client at ServerResponse 【发布时间】:2019-06-02 10:06:56 【问题描述】:我正在尝试使用没有任何数据库的 NodeJS 和 Express 创建一个简单的 REST API。我已将所有数据存储在 JSON 文件中。 数据是对象数组的形式。
我有类似 fund-name/:portId 的路径
所以我正在这样做:
const fundName = require('./json/fund-name.json');
app.get('/fund-details:portId', (req, res) =>
const portId = req.params.portId;
fundDetails.forEach(fund =>
if (fund.portId === portId)
return res.json(fund);
return res.json([]);
);
);
当我点击 url http:localhost:3000/fund-details/1234
时,我收到以下错误:
错误 [ERR_HTTP_HEADERS_SENT]:发送后无法设置标头 给客户 在 ServerResponse.setHeader (_http_outgoing.js:470:11) 在 ServerResponse.header (/home/username/Desktop/data-server/node_modules/express/l ib/response.js:767:10)
当我不通过任何路径参数来获取所有资金时,它工作正常。 我哪里错了??
【问题讨论】:
【参考方案1】:此错误是因为您在单个 api 调用中多次使用 res.send()。 正确方法
if(a)
res.send()
else
res.send()
错误的方式
if(a)
res.send()
res.send()
else
res.send()
在您的代码中。
app.get('/fund-details:portId', (req, res) =>
const portId = req.params.portId;
fundDetails.forEach(fund =>
if (fund.portId === portId)
return res.json(fund); // many or single times here
return res.json([]); // and here when fund !==portId here
);
);
你可以试试
app.get('/fund-details:portId', (req, res) =>
const portId = req.params.portId;
var flag
var data = []
fundDetails.forEach(fund =>
if (fund.portId === portId)
flag=true
data.push(fund)
);
if(flag)
res.send(data);
else
res.send()
);
【讨论】:
【参考方案2】:res.json(fund)
方法在fundDetails 中的每个项目都被调用,然后另一个res.json([])
方法被调用。这会导致您的响应被多次发回(这是不应该发生的,每个 api 调用只应使用 1 个响应)。
我建议你使用一个数组,将匹配端口id的对象推回,然后在操作完成后将数组发回给用户。老实说,你甚至不需要 flag 变量来检查资金是否存在,因为如果不存在,你的空数据数组就会被发回。
var data = [];
fundDetails.forEach(fund =>
if (fund.portId === portId)
data.push(fund);
);
res.json(data);
【讨论】:
以上是关于ERR_HTTP_HEADERS_SENT:在 ServerResponse 将标头发送到客户端后无法设置标头的主要内容,如果未能解决你的问题,请参考以下文章
ERR_HTTP_HEADERS_SENT:在 ServerResponse 将标头发送到客户端后无法设置标头
我该如何修复(节点:5796)UnhandledPromiseRejectionWarning:错误[ERR_HTTP_HEADERS_SENT]:错误?
我该如何修复(节点:5796)UnhandledPromiseRejectionWarning:错误[ERR_HTTP_HEADERS_SENT]:错误?
Firebase - Node.js - Express - 错误 [ERR_HTTP_HEADERS_SENT]