Node.js - 同步操作:文件读取后跟更新

时间:2017-09-16 21:40:51

标签: node.js mongodb synchronous file-read

这可能是一个承诺实施,但在此之前请先咨询专家。

需要这样做:

  1. 逐行读取整个文件到MongoDB集合A
  2. 完成第1步后,根据集合Insert/Update/Delete中的状态,收集B中的A个文档。如果A中没有的文档从B删除。
  3. 问题:即使在上述step 1完成之前,step 2也会开始执行,并开始从B删除记录。

    到目前为止已尝试: Async.series不起作用。下面给出的是我的代码。

    MongoClient.connect(config.mongodb.uri, function (err, db) {
      if (err) {
        logger.error('Unable to connect to the mongoDB server. Error:', err);
        reject(err);
      } else {
        let startTime = new Date();
    
        async.series([
          function(callback) {
            console.log('First in series');
    
            db.collection('eligibilityStage').drop({}, function (err, oldObject) {
              debugger;
              var lr = new LineByLineReader(config.eligibiltyFile.fileRemoteLocation +  '/' + latestEligibilityfileName);        
              lr.on('error', function (err) {
                console.log(err);
              });
              var lineCount;
              lr.on('line', function (line) { //** --> Jumps from here to second function in series, line#43**
                if (line.length == config.eligibiltyFile.detailRecordlineWidth) { 
    
                  var document = require('fixy').parse({
                    map: mapData, options: {
                      skiplines: null, fullwidth: config.eligibiltyFile.detailRecordlineWidth
                    }
                  }, line);
    
                  db.collection('eligibilityStage').insertOne(document[0], function (err, records) {
                    lineCount++;
                    if (err) {
                      console.log(err);
                    }
                  });
                }
              });        
              lr.on('end', function () {        
                console.log('File is closed, read lines:'+lineCount);
                console.log('File is closed, rowcount:'+db.eigibilityStage.Count());
              });                             
              callback(null, 'loadStage');    
            });
          },
          function(callback) {
            // Deletes
            console.log('Series 2 function, read lines:'+lineCount);
            console.log('Series 2 function, rowcount:'+db.eigibilityStage.Count());    
            callback(null, 'processStage');
          }
        ],
        function(err, results){
    
        });
      }
    })
    

    我做错了吗?或者这是使用诺言解决的标准问题?

0 个答案:

没有答案