javascript - Node Mysql查询队列但从不执行

标签 javascript mysql node.js

我循环遍历一些目录,然后循环其中的文件。我按目录处理文件,然后尝试将处理结果添加到 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/

相关文章:

javascript - 我如何使用 javascript 获取页面上包含特定单词的链接

javascript - 强制浏览器只刷新 1 个文件

node.js - 被 Node js ssl 服务器错误消息 "Assertion failed: (wrap->ssl_) != (nullptr), file src\tls_wrap.cc, line 319"难住了

javascript - jquery slider 在第一次时隐藏 .prev 按钮

javascript - 将一个 Javascript 文件导入另一个 Javascript 文件

mysql - SQL 功能错误

mysql - 如何使用 join 和 group by 为同一列检索具有不同计算值的 sql 结果?

mysql - 通过命令行使用 mysql 时出现奇怪的输出

javascript - 我需要担心 Node.js 中的并发修改吗?

node.js - 找不到 ffprobe?