我循环遍历一些目录,然后循环其中的文件。我按目录处理文件,然后尝试将处理结果添加到 MySQL 中。 我调用 conn.query('INSERT QUERY HERE') ,它似乎继续,但查询从未在服务器上运行。如果我告诉它只处理一个目录并等到最后,它将运行查询,但我不能让它继续将所有查询存储在内存中,直到脚本末尾或 Node 由于内存上限而失败。我已经尝试了所有我能想到的方法来尝试强制排队查询运行,但没有成功。
这是我的代码示例
dirs.forEach(function(dir){
var data = [];
var connection = mysql.createConnection(conConfig);
files.forEach(function(file){
//do some processing on files push into data array
//creating array of objects
});
data.forEach(function(record){
connection.query('INSERT INTO TABLE SET ?', record);
});
connection.end();
});
代码将继续循环遍历目录,而不会将查询发送到 mysql。我知道它可以通过限制代码仅在一个目录上运行来工作,并且一旦处理了一个目录,它就会运行查询,但如果我让它在所有目录上运行,则不会。
我也尝试过使用 mysql 池,但没有成功。这
pool.on('enqueue' function...
将触发,但永远不会将其发送到服务器。
编辑: 因此,我尝试使用 bash 中的 for 循环调用脚本来单独调用每个目录名称,并加载所有记录。我很困惑为什么在我的原始示例中从未建立 mysql 连接。
最佳答案
Javascript异步调用mysql查询。这意味着在所有插入查询完成之前连接可能会关闭。
您可以做的是使用查询函数提供的回调:
var qCnt = array.length;
var connection = mysql.createConnection(conConfig);
connection.connect();
array.forEach(function(record){
connection.query('INSERT INTO TABLE SET ?', record, function(err){
if (err) throw err;
qCnt--;
if (qCnt == 0){
connection.end();
}
});
});
此解决方案并不理想,因为无论您的数据库连接限制等如何,都会触发所有插入查询。您可能只想在前一个插入完成后才触发下一个插入。通过一些技巧也可以实现这一点。
关于javascript - Node Mysql查询队列但从不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34444720/