[英]Can't figure out why I keep getting [ERR_HTTP_HEADERS_SENT] error
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});
});
然后我只在 if 語句為假時收到錯誤。 為什么會這樣?
您正在返回內部 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 語句的結果將 boolean 傳遞給渲染 function,因此我沒有調用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} );
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.