javascript - 如何在node js服务器的for循环中管理近5000条记录?

标签 javascript mysql node.js mongodb

我使用 NodeJS 创建了一个服务器。 MySQL中有一个数据库,里面有近5000个用户。我必须读取 mysql 数据库并更新并在 MongoDB 数据库中创建日志。我为此实现了一个代码。 https://gist.github.com/chanakaDe/aa9d6a511070c3c78ba3ebc018306ad8

问题就在这里。在此代码的第 50 行中,我添加了该值。

userArray[i].ID]

这是来自 for 循环的用户 ID,我需要使用该 ID 更新 mysql 表。 for 循环 block 中的所有这些代码。但我收到此错误。

TypeError: Cannot read property 'ID' of undefined

因此我将这些值分配给顶部的变量。请参阅第 38 行和第 39 行。

var selectedUserID = userArray[i].ID;
                var selectedUserTelephone = userArray[i].telephone;

当我这样使用时,没有错误。但用户 ID 没有更新。最近 2 个值具有相同的用户 ID。

这个问题的解决方案是什么?

最佳答案

这是一个常见的 JavaScript 问题,与异步操作期间变量的范围和提升的概念相关。

var a = 0;

function doThingWithA () {
  console.log(a)
}

for (var i=0; i<1000; i++) {
  a++;
  setTimeout(function () {
    doThingWithA();
  }, 10);
}

在此示例中,“a”将始终以 1000 的值进行记录。其原因是 setTimeout(模仿慢速数据库操作)需要时间,并且在此期间(在日志发生之前)“a”增加为 1000,因为 for 循环不等待 setTimeout 完成。

最好的解决方案是使用“异步”模块。

pool.getConnection(function (err, connection) {
  connection.query(query, function (err, users) {
    async.eachSeries(users, function (user, next) {
      async.parallel([
        function updateUserStatus (cb) { /* your current code */ },
        function updateUserAccount (cb) { /* current code for this */ }
      ], next);
    }, function (err) { console.log('finished for all users!') })
  });
});

您还可以使用 promise 。这是 Node.js 中典型的异步问题。通过阅读您的代码,您似乎认为每个操作都是串行运行的,而在 Node 中,每个输入/输出(例如数据库调用)都会被触发,但您的代码继续运行,如上面的 for 循环示例所示。

关于javascript - 如何在node js服务器的for循环中管理近5000条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41348948/

相关文章:

java - android浏览器javascript问题

javascript - 如何在 javascript 中按名称访问元素?

javascript - 为什么在使用for命令时将 “Unexpected token )”扔给我?

mysql - 更新更新触发器中的其他行

xcode - 如何通过 xcode 应用程序将当前目录路径(路径中的空格)发送到终端

javascript - 如何在启动 funcC() 之前执行未定义数量的 funcA() 和 funcB()?

javascript - 关于一段代码

c++ - Oracle 是否正式支持动态记录集?

MYSQL - #1005 - 无法创建表 'dbwms.t_trucks' (errno : 150)

node.js - 将 url 保存到字符串 nightwatch