ERR_HTTP_HEADERS_SENT: Невозможно установить заголовки после их отправки клиенту на ServerResponse - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь создать простой REST API с NodeJS и Express без какой-либо базы данных. Я сохранил все свои данные в файлах 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 / имя пользователя / рабочий стол / сервер данных / node_modules / express / l IB / response.js: 767: 10)

Это прекрасно работает, когда я не передаю параметры пути, чтобы получить все средства. Куда я иду не так ??

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Метод res.json(fund) вызывается для каждого элемента в fundDetails, а затем вызывается дополнительный метод res.json([]). Это приводит к тому, что ваш ответ отправляется обратно несколько раз (чего не должно быть, должен использоваться только 1 ответ на один вызов API).

Я предлагаю вам использовать массив и отодвинуть объекты с соответствующим идентификатором порта, а затем отправить массив обратно пользователю, когда операция будет завершена. Честно говоря, вам даже не нужна переменная flag, чтобы проверить, существуют ли средства или нет, поскольку, если их нет, ваш пустой массив данных отправляется обратно.

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

res.json(data);
0 голосов
/ 07 января 2019

Эта ошибка вызвана тем, что вы используете res.send () несколько раз в одном вызове API.
Правильный путь

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()
}
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...