2017-06-04 40 views
1

這裏是我的路線無法在node.js中打印陣列

router.get('/chkjson', function(req, res, next) { 
    req.getConnection(function(err,connection){ 
     var ItemArray = []; 
     var myset = []; 

     var query = connection.query('SELECT `db_name` FROM `database`',function(err,rows) 
     { 
      ItemArray.push({ 
       allDb : [] 
      }); 
      var k=0; 
      for (var i in rows) { 
        retset = JSON.stringify(rows[i]); 
        var jsonset = JSON.parse(retset); 
        console.log(ItemArray); 
        console.log("========"); 
        myset.push(ItemArray); 
        ItemArray[0].allDb.push(jsonset.db_name); 
      } 
     }); 
     console.log(myset); //blank array 
     console.log("-----"); 
     console.log(ItemArray); //blank array 
     console.log("-----"); 
      res.render('new/post-select-table', 
       { 
        title: 'Select Database', 
        session_store:req.session, 
       }); 
     }); 
}); 

我得到空數組時,我試圖外面打印陣列的循環代碼。任何人都可以幫助我哪裏出錯。

回答

0

connection.query()是異步的,在您的代碼中,您在查詢的回調之外記錄了ItemArray。該數組將爲空,因爲它尚未設置爲任何值(即,您的回調不會與結果一起開啓)。下面移動你的console.log S和渲染功能之外循環,但回調的裏面,所以它應該打印您的最終結果ItemArray預期:

router.get('/chkjson', function(req, res, next) { 
    req.getConnection(function(err,connection){ 
     var ItemArray = []; 
     var myset = []; 

     var query = connection.query('SELECT `db_name` FROM `database`',function(err,rows) 
     { 
      ItemArray.push({ 
       allDb : [] 
      }); 
      var k=0; 
      for (var i in rows) { 
        retset = JSON.stringify(rows[i]); 
        var jsonset = JSON.parse(retset); 
        console.log(ItemArray); 
        console.log("========"); 
        myset.push(ItemArray); 
        ItemArray[0].allDb.push(jsonset.db_name); 
      } 

      console.log(myset); //blank array 
      console.log("-----"); 
      console.log(ItemArray); //blank array 
      console.log("-----"); 
       res.render('new/post-select-table', 
        { 
         title: 'Select Database', 
         session_store:req.session, 
        }); 
     }); 
    }); 
}); 
0

查詢中的回調函數異步調用,在數據填充到數組中之前執行打印。

您必須從回調中異步調用res.render。我不明白在你的代碼的所有操作,但這裏是鏈接查詢和響應的例子:

router.get('/chkjson', function(req, res, next) { 
    req.getConnection(function(err,connection){ 
    connection.query('SELECT `db_name` FROM `database`',function(err,rows) { 
     var myset = [], row; 
     for (row in rows) { 
     myset.push(row); 
     } 
     res.render('new/post-select-table', { 
     title: 'Select Database', 
     session_store:req.session, 
     set: myset 
     }); 
    }); 
    }); 
}); 

如果您需要產業鏈的要求,你可以使用promise-mysql輕鬆處理同步,或modularise你的代碼避免回調地獄。

例子:

var connection, row1, row2 
router.get('/chkjson', handleRequest); 
function handleRequest (req, res, next) { 
    req.getConnection(onGotConnection); 
} 
function onGotConnection(err,conn) { 
    connection = conn; 
    connection.query(query1, onGotEntity1); 
} 
function onGotEntity1(err,rows) { 
    rows1 = rows 

    connection.query(query2, onGotEntity2); 
} 
function onGotEntity2(err,rows) { 
    row2 = rows 

    // render view 
    res.render('new/post-select-table', { 
     k1: rows1, 
     k2: rows2 
    }); 
} 

但我建議使用是一個更容易閱讀的承諾(和管理錯誤):

mysql.createConnection(opts).then(function(conn){ 
    connection = conn; 
    return connection.query(query1); 
}).then(function(rows){ 
    return connection.query(query2); 
}).then(function(rows){ 
    // render view 
}); 
+0

感謝您的回答Yoann。但是如果我不得不做多個connection.query()語句。那我怎麼可以傳遞多個查詢的多個結果呢? – sunshine

+0

我已經以這種方式更新了我的答案。這足夠清楚了嗎? – Yoann

0

你不能只返回數組,並把它推到全局變量?

var query = connection.query("soandso", function(err, result) { 
    var allDb = []; 

    return allDb; 
} 

ItemArray.push(query);