当前位置: 首页 > 知识库问答 >
问题:

ERR_HTTP_HEADERS_SENT:在服务器响应中发送到客户端后无法设置标头

白文彬
2023-03-14

我正在尝试创建一个简单的没有任何数据库的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([]);
    });
});

当我点击网址 http:localhost:3000/基金详细信息/1234 时,我收到以下错误:

错误[ERR_HTTP_HEADERS_SENT]:在ServerResponse.header(/home/username/Desktop/data-server/node_modules/Express/l ib/response.js:767ServerResponse.setHeader(_http_outgoing.js:470: 11)发送到客户端后无法设置标头

当我不传递任何路径参数来获取所有资金时,它工作正常。我哪里出错了??

共有2个答案

司徒胤
2023-03-14

方法 res.json(基金) 是按基金详情中的每个项目调用的,然后调用另一个 res.json([]) 方法。这会导致您的响应被多次发回(这不应该发生,每个 API 调用只应使用 1 个响应)。

我建议您使用一个数组并推回具有匹配端口 ID 的对象,然后在操作完成后将数组发送回用户。说实话,你甚至不需要标志变量来检查资金是否存在,因为如果它们不存在,你空的数据数组就会被发送回去。

var data = [];
fundDetails.forEach(fund => {
  if (fund.portId === portId)
    data.push(fund);
});

res.json(data);
龙越彬
2023-03-14

此错误是因为您在单个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()
}
});
 类似资料:
  • 我在NodeJS中使用Passport.js、Express和Mongoose时遇到了这个奇怪的问题。基本上,即使我只发送了一个头,我还是得到一个错误,说“不能在头被发送到客户端后设置它们”。 我读过其他帖子并尝试过,但没有一个有效。 应用程序。get-res.send与return res.send之间有什么区别吗 错误[ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后,无法设

  • 所以我看到了一篇很棒的帖子“错误:发送到客户端后无法设置标题,但仍然不明白我的“标题”部分有什么问题,因为当我将它从注释掉的

  • 首先,我为拼写错误道歉,我是巴西人 我访问了下面的问题,但它没有帮助我解决问题 ERR_HTTP_HEADERS_SENT:将标头发送到客户端后,无法设置标头 我有一个方法,我从路由调用在第一个请求,它按预期工作 但在下一个命令中,它返回以下错误 我的代码 我尝试使用失败 这个方法返回一个从excel电子表格中读取的对象 服务器我的代码出错

  • 我正在关注一个关于udemy上的节点.js的课程,这有点过时了,遇到了这些错误,我无法找到解决方案。 我尝试了什么: 使用next(); 在所有if语句中添加返回res 有人能帮我修一下这些吗?我将不胜感激! 提前感谢! 用户名存在错误:错误 [ERR_HTTP_HEADERS_SENT]:在服务器响应.set 上将标头发送到客户端后无法设置标头 (_http_outgoing.js:526:11

  • 我得到状态代码201,但是当我尝试重定向到approval_url时,我得到 错误[ERR_HTTP_HEADERS_SENT]:无法在发送到客户端后设置标头 当我手动单击approval_url时,我尝试不重定向,所有工作都很好。 服务器启动!{id:'payid-l3azrlq4la763246g079113e',意图:'sale',状态:'created',付款人:{payment_meth

  • 问题内容: 将标头发送到客户端后,无法设置标头。这是请求验证后的后端错误,看起来像标头问题。我为我的项目脏代码感到抱歉,我还需要做其他事情,因此在注释中有一些代码。这是我的代码 您可以在我的代码中发现其他错误,因为我尝试了许多不同的方法。这是passport.js配置文件 这是身份验证的ajax请求 非常感谢你。 问题答案: 这是由于您的代码试图从authenticate函数发送多个响应。 删除其