[英]Node Express MySQL and the Error: Can't set headers after they are sent
我正在使用Node.js,Express.js和MySQL數據庫。 在數據庫中,我想使用Pug.js視圖引擎顯示帖子。 我可以通過連接到數據庫並正確渲染本地路由來使其正常工作,但是我顯然在進行第二次回調,因為出現錯誤:
發送標頭后無法設置。
我不確定如何解決此問題而不作進一步介紹,因為它現在實際上已按預期呈現。 這是我正在使用的:
app.js:
// Home Route
app.get('/', function(req, res){
//get posts from database to show on news section.
var postList = [];
db.query('SELECT * from articles', function(err, rows) {
if(err) throw err;
for (var i = 0; i < rows.length; i++) {
//missing the img fields
var post = {
'id':rows[i].id,
'title':rows[i].title,
}
//Add the newly created post object to the postList array
postList.push(post);
//THE ERROR IS PROBABLY BECAUSE OF THIS \/
res.render('index', {
title:'mySite',
page: 'News',
postList: postList});
}
});
});
這是index.pug:
extends layout
block content
table
for post in postList
tr
td
h3 #{post.title}
td
p #{post.id}
它再次呈現良好,但是終端向我拋出錯誤,如果可能的話,我希望修復它。 我試圖像這樣從查詢中提取索引的res.render:
// Home Route
app.get('/', function(req, res){
//get posts from database to show on news section.
var postList = [];
db.query('SELECT * from articles', function(err, rows) {
if(err) throw err;
for (var i = 0; i < rows.length; i++) {
//missing the img fields
var post = {
'id':rows[i].id,
'title':rows[i].title,
}
//Add the newly created post object to the postList array
postList.push(post);
}
});
//THIS FIXES THE ERROR \/
res.render('index', {
title:'mySite',
page: 'News',
postList: postList});
//THIS NO LONGER RENDERS THE postList ARRAY
});
任何幫助,將不勝感激。 謝謝。
你幾乎說對了,伙計! 但是render
應該在db.query
內部,例如
//get posts from database to show on news section.
var postList = [];
db.query('SELECT * from articles', function (err, rows) {
if (err) throw err;
for (var i = 0; i < rows.length; i++) {
//missing the img fields
var post = {
'id': rows[i].id,
'title': rows[i].title,
}
//Add the newly created post object to the postList array
postList.push(post);
} // end for loop
res.render('index', {
title: 'mySite',
page: 'News',
postList: postList
});
});
解釋是db.query
是回調函數,如果將res.render
放在res.render
外部,則javascript引擎將首先執行它,因此postList
什么也不會得到。 因此,您必須等待db.query
完成並填充postList
然后進行渲染。
為何原因發送標頭后無法設置標頭,因為您多次執行res.render
(將其放入循環中)。 它只能執行一次。
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.