ERR_HTTP_HEADERS_SENT:在ServerResponse上将标头发送到客户端后,无法设置标头

时间:2019-01-07 18:05:43

标签: node.js express

我正在尝试使用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/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)

当我不通过任何路径参数来获取所有资金时,它会很好地工作。 我要去哪里错了?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

在fundDetails中的每个项目上调用方法res.json(fund),然后调用另一个res.json([])方法。这会导致您的响应被发送回多次(这种情况不应该发生,每个api调用仅应使用1个响应)。

我建议您使用数组,并推回具有匹配端口ID的对象,然后在操作完成后将数组发送回用户。坦白地说,您甚至不需要flag变量来检查资金是否存在,因为如果不存在,则将空数据数组发回。

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

res.json(data);