【问题标题】:Unable to print array in node.js无法在 node.js 中打印数组
【发布时间】:2017-11-05 06:06:55
【问题描述】:

这是我在路线中的代码

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

当我尝试在 for 循环之外打印数组时,我得到了空白数组。谁能帮我解决我哪里出错了。

【问题讨论】:

    标签: javascript mysql arrays node.js express


    【解决方案1】:

    查询中的回调函数是异步调用的,打印在数据填充到数组之前执行。

    您必须从回调中异步调用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 轻松处理同步,或者模块化您的代码以避免回调地狱。

    例子:

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

    但我建议使用更易于阅读(和管理错误)的 Promise:

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

    【讨论】:

    • 感谢您的回答 Yoann。但是如果我必须创建多个 connection.query() 语句怎么办。那么我如何从多个查询中传递多个结果呢?
    • 我已经以这种方式更新了我的答案。够清楚吗?
    【解决方案2】:

    你不能直接返回数组并将其推送到全局变量吗?

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

    【讨论】:

      【解决方案3】:

      connection.query() 是异步的,在您的代码中,您将在查询回调之外记录ItemArray。该数组将为空,因为它尚未设置为任何内容(即,您的回调还没有触发结果)。以下将您的 console.logs 和渲染函数移到 for 循环之外,但在回调内部,因此它应该按预期打印 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,
                          });
              });
          });
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-04
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        相关资源
        最近更新 更多