无法在node.js

时间:2017-06-04 09:11:10

标签: javascript mysql arrays node.js express

这是我在路线中的代码

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

当我试图在外面打印数组时,我得到了空白数组。任何人都可以在我出错的地方帮助我。

3 个答案:

答案 0 :(得分:0)

connection.query()是异步的,在您的代码中,您在查询的回调之外记录ItemArray。该数组将为空,因为它尚未设置为任何内容(即您的回调函数尚未触发)。下面将你的console.log和渲染函数移到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,
                    });
        });
    });
});

答案 1 :(得分: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轻松处理同步,或模块化代码以避免回调地狱。

示例:

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

答案 2 :(得分:0)

难道你不能只返回数组并将其推送到全局变量吗?

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

    return allDb;
}

ItemArray.push(query);