这是我在路线中的代码
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 :(得分: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);