簡體   English   中英

Node Express MySQL和錯誤:發送標頭后無法設置標頭

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM