首页 > 解决方案 > ERR_HTTP_HEADERS_SENT:在 ServerResponse 将标头发送到客户端后无法设置标头

问题描述

我正在尝试使用没有任何数据库的 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.header (/home/username/Desktop/data-server/node_modules/express/lib /response.js:767:10)

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

标签: node.jsexpress

解决方案


此错误是因为您在单个 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()
}
});

推荐阅读