node.js中的顺序编程

node.js中的顺序编程,node.js,Node.js,我是node的初级到中级。我试图弄清楚node.js对于顺序作业有多好。我必须编写一个迁移脚本,从数据库a的10个表中获取所有数据,并将其发布到数据库B的另一组10个表中。我们需要将插入或读取失败捕获到单独的日志文件中 其他详情 插入或读取在表之间没有任何依赖关系。我只需要确保在插入到B中的相应表之前,我从数据库a读取了特定表的数据 数据库B是一个缓慢的系统,在超出一定限制的大量并行请求下可能会失败。所以最好在表之后插入数据表。 现在我想看看node是否适合这项工作。我知道我们可以通过嵌套回调或

我是node的初级到中级。我试图弄清楚node.js对于顺序作业有多好。我必须编写一个迁移脚本,从数据库a的10个表中获取所有数据,并将其发布到数据库B的另一组10个表中。我们需要将插入或读取失败捕获到单独的日志文件中

其他详情

插入或读取在表之间没有任何依赖关系。我只需要确保在插入到B中的相应表之前,我从数据库a读取了特定表的数据 数据库B是一个缓慢的系统,在超出一定限制的大量并行请求下可能会失败。所以最好在表之后插入数据表。 现在我想看看node是否适合这项工作。我知道我们可以通过嵌套回调或异步模块获得串行执行


但是,即使使用async module series和eachSeries方法,我也可以保证表一个接一个地迁移,并且对于特定的able,可以保证行一个接一个地插入?。迁移一个表时的错误会影响另一个表吗

最近,我不得不做一些非常类似的事情,两个巨大的查询无法并行运行,并且可以使用promises来完成。如果您希望,该错误只会影响其他表的迁移,但是如果这对您的用例有效,您可以继续

下面是一些众所周知的promise库,您可以使用它们来设置类似的内容。只要让每一份工作都回报一个承诺,并在承诺兑现后才开始下一份工作

编辑:下面是我的超级简单顺序数据库副本的代码的一个小示例

replicateDB('fails', FailModel)
  .then(function (message) {
    replicateDB('encodes', EncodeModel);
  },
  function (err) {
    console.log(err);
  })
  .then(function (message) {
    console.log(message);
  },
  function (err) {
    console.log(err);
  })
我使用Q,因为它很容易添加到我现有的代码中,并且只需要将以下内容添加到我拥有的replicateDB函数中

var deferred = Q.defer();
...

//If replication failed
deferred.reject(err);
...

//If replication succeeded
deferred.resolve('success in  ' + dbname);

正如您所提到的,可以使用异步的eachSeries来完成。不过,路上有一处颠簸;如果其中一个迭代回调错误,async将停止整个循环

假设你有这个:

var queries = [...]; // Imagine some actual queries

async.eachSeries(queries, function(query, callback) {
    db.query(query, callback); // Do your database thing
}, function handleQueriesCompleted(error) {
    if (error) {
        return console.error(error);
    }
    console.log('Completed!');
});
如您所知,每个系列仅在前一个迭代完成后(即调用其回调)才开始下一个迭代

现在假设查询包含五个实际查询,前三个查询成功完成,但第四个查询从数据库中产生错误。现在,第五个查询将永远不会执行,因为第四次迭代传递了一个错误

您可以通过包装db.query调用,只将错误写入日志,而不将错误传递给回调来缓解此问题,如下所示:

async.eachSeries(queries, function(query, callback) {
    db.query(query, function(error) {
        if (error) {
             console.error(error);
        }
        callback(null);
    });
}, function handleQueriesComplete(error) { ... } );

您是在笔记本电脑上以脚本语言(可能是一次性迁移)还是在web服务器上以客户端启动的过程(可能会多次调用)运行此功能?无论是嵌套回调还是每个系列都将保持顺序。如果在笔记本电脑上,就不用担心阻塞主执行线程。如果在服务器上,请使用子进程,例如,请参阅。我将通过cron作业定期以批处理进程的形式运行它。迁移是一次或每天的所有数据和表。