数字变量增量 - 运行时的意外数字

时间:2017-04-20 15:09:56

标签: javascript node.js

给定以下node \ 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..\r\n`);

    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}\r\n`);
            closeConnectionsCallback();
        }
    });
};

1 个答案:

答案 0 :(得分:0)

看起来确实像是一个异步问题。在cursor.each内,你有异步回调来处理connection.query。因此,当each迭代时,它会进行查询。但是所有查询都是异步运行的。

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