Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';我不明白为什么我总是收到[ERR\u HTTP\u HEADERS\u SENT]错误_Javascript_Node.js_Express_Http Headers - Fatal编程技术网

Javascript Can';我不明白为什么我总是收到[ERR\u HTTP\u HEADERS\u SENT]错误

Javascript Can';我不明白为什么我总是收到[ERR\u HTTP\u HEADERS\u SENT]错误,javascript,node.js,express,http-headers,Javascript,Node.js,Express,Http Headers,Error[ERR\u HTTP\u HEADERS\u SENT]:发送到客户端后无法设置头 我看过其他关于同一问题的帖子,但我无法找到解决问题的方法。我有处理post请求的代码,如下所示: router.post('/', function(req, res) { var movies = JSON.parse(fs.readFileSync('movies.json')); var title = req.body.title; movies.forEach(function(

Error[ERR\u HTTP\u HEADERS\u SENT]:发送到客户端后无法设置头

我看过其他关于同一问题的帖子,但我无法找到解决问题的方法。我有处理post请求的代码,如下所示:

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});
});

那么我只在if语句为false时接收错误。为什么会这样?

您正在返回内部for循环,因此每次它都会发送

如下所示修改代码

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});
   }
  });
});

事实证明,我需要的解决方案比我想象的要简单得多。我需要根据if语句的结果将一个布尔值传递给render函数,因此我没有调用两次
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} );
});