【问题标题】:ERR_HTTP_HEADERS_SENT: Cannot set headers after they are sent to the client at ServerResponseERR_HTTP_HEADERS_SENT:在 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)

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

【问题讨论】:

    标签: node.js express


    【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2020-06-21
        • 2019-02-06
        • 2020-05-20
        • 2019-06-15
        • 2020-05-26
        • 2018-09-19
        • 2023-01-19
        • 2021-02-26
        • 2021-08-20
        相关资源
        最近更新 更多