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]

ERR_HTTP_HEADERS_SENT:无法设置 cookie

Express.js 中的新 Mongoose Schema `ERR_HTTP_HEADERS_SENT` 错误