2017-06-04 41 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);