数字变量增量 - 运行时出乎意料的数字



给定以下节点 javascript代码,由于某些原因,计数器变量(failedCounter, successMatchedCounter, successUnmatchedCounter(在运行时以出乎意料的方式计数。我认为这是一个范围和异步的问题,但仍然无法发现原因。

更新:我认为当所有呼叫connection.query()都完成并且只有然后记录计数器时,我应该通知我。

请参阅"//BUG: counted numbers are not logged as expected"的行:

var MongoClient = require('mongodb').MongoClient;
var mysql = require('mysql2');
var fs = require('fs');
var dir = './logs';
if (!fs.existsSync(dir)) {
    fs.mkdirSync(dir);
}
var testMode = false;
var mongoUrl = 'mongodb://xxx:27017/yy';
var mySqlconnString = {
    host: 'xxxxx',
    user: 'xxxx',
    password: 'xxxxx',
    database: 'xxxxx'
};
var connection = mysql.createConnection(mySqlconnString);
connection.connect(function(err) {
    if (err) {
        console.log('Error connecting to MySql DB');
        return;
    }
    console.log('Connection established to MySql DB');
    MongoClient.connect(mongoUrl, function(err, db) {
        if (err) {
            console.log('Error connecting to MongoDB');
            return;
        }
        console.log("Connection established to MongoDB");
        markSitesAsDeleted(db, function() {
            console.log('closing DBs connections..');
            connection.end(function(err) {});
            db.close();
        });
    });
});

var failedCounter = 0;
var successMatchedCounter = 0;
var successUnmatchedCounter = 0;
var totalCounter = 0;
var markSitesAsDeleted = function(db, closeConnectionsCallback) {
    console.log(`nMigration process is starting..`);
    var cursor = db.collection('someCollection').find({
        "isDeleted": true
    });
    console.log(`Migrating data..rn`);
    cursor.each(function(err, siteDoc) {
        if (siteDoc != null) {
            var siteID = Math.trunc(siteDoc._id)
            if (testMode === false) {
                connection.query(`CALL MarkSiteAsDeleted_3(${siteID})`, function(error, rows) {
                    if (error) {
                        //TODO: Print error
                        failedCounter++;
                        fs.appendFileSync('logs/log.txt', `Error occured when calling MarkSiteAsDeleted_3 SP for SiteId=${siteID}. see error: ${JSON.stringify(error)}n`);
                    } else {
                        if (rows.affectedRows === 1) { // Has match
                            successMatchedCounter++;
                        } else {
                            successUnmatchedCounter++;
                        }
                    }
                });
            }
            totalCounter++;
        } else {
            //BUG: counted numbers are not logged as expected
            fs.appendFileSync('logs/log.txt', `Total: ${totalCounter}, Success and Matched: ${successMatchedCounter}, Success but Unmatched: ${successUnmatchedCounter}, Failed: ${failedCounter}rn`);
            closeConnectionsCallback();
        }
    });
};

它肯定看起来像一个异步问题。在您的cursor.each内部,您有异步回调可以处理connection.query。因此,随着each迭代,它会进行查询。但是所有查询都不同步。

每个人都完成了所有异步查询后,它就会击中您的else,该查询使用同步写入。这就是问题发生的地方。您的某些异步查询处理程序尚未完成。

最新更新