Не могу понять, почему я получаю ошибку [ERR_HTTP_HEADERS_SENT] - PullRequest
0 голосов
/ 09 октября 2019

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

Я видел другие посты об этой же проблеме, но не смог выяснить, как решить мою проблему. У меня есть код для обработки почтового запроса, например, так:

router.post('/', function(req, res) {
  var movies = JSON.parse(fs.readFileSync('movies.json'));
  var title = req.body.title;
  movies.forEach(function(movie) {
    if (title == movie.title) {
      return res.render('movie', { watched: false });
    } else {
      return res.render('movie', { watched: true });
    }
  });
});

Я понимаю, что проблема в том, что res.render() присутствует там дважды, но даже с оператором return это все равно выдает мне ту же ошибку, поэтому яМне трудно понять, как он отправляется дважды. Разве он должен отправляться только один раз из-за ключевого слова return?

Кроме того, если я изменю свой код следующим образом:

router.post('/', function(req, res) {
  var movies = JSON.parse(fs.readFileSync('movies.json'));
  var title = req.body.title;
  movies.forEach(function(movie) {
    if (title == movie.title) {
      return res.render('movie', { watched: false });
    }
  });
res.render('movie', { watched: true});
});

Тогда я получу ошибку только тогда, когдаутверждение неверноПочему это так?

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Вы возвращаетесь внутрь для цикла, поэтому каждый раз при отправке

изменяйте свой код, как показано ниже

router.post('/', function(req, res) {
  var movies = JSON.parse(fs.readFileSync('movies.json'));
  var title = req.body.title;
  var counter =0;
  var arr = [];
  movies.forEach(function(movie) {
    if (title == movie.title) {
      arr.push({ watched: false , movieId:id})      
    } else {
      arr.push({ watched: true , movieId:id})
    }
    counter++;
   if(counter == movies.length){
      return res.send({'movie':arr});
   }
  });
});
0 голосов
/ 09 октября 2019

Оказывается, решение, в котором я нуждался, было намного проще, чем я думал. Мне нужно было передать логическое значение в функцию рендеринга на основе результата оператора if, поэтому вместо того, чтобы дважды вызывать res.render(), я просто создал новую переменную для хранения результата оператора if и затем передал ее в res.render()поэтому он вызывается только один раз.

router.post('/', function(req, res) {
  var movies = JSON.parse(fs.readFileSync('movies.json'));
  var title = req.body.title;
  var isWatched = false;
  for (let value in movies) {
      if (movies[value].title === title) {
        isWatched = true;
      }
    }
  res.render('movie', { watched: isWatched} );
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...