我有一个MongoDB数据库,其中设置了一些具有唯一代码(而不是主键)的对象。
我还应该注意,我正在使用NodeJS,并且此代码位于server.js中,用于连接到MongoDB数据库。

要生成一个新代码,我随机生成一个代码,我想检查它是否已经存在。如果不是,那么我们使用它没问题,但是如果它已经存在,我想生成另一个代码并再次检查它。这是我用来检查ID是否已存在的代码:

function createPartyId(callback) {
    var min = 10000, max = 99999;
    var partyId = -1, count = -1;
    async.whilst(
        function () { return count != 0; },
        function (callback) {
            partyId = min + Math.floor(Math.random() * (max - min + 1));
            partyId = 88888;
            getPartyIdCount(partyId, function(num) {
                count = num;
            });
        },
        function (err) {

        }
    );
}

function getPartyIdCount(partyId, callback) {
    count = -1;
    db.db_name.find({id: partyId}, function(err, records) {
        if(err) {
            console.log("There was an error executing the database query.");
            callback(count);
        }
        count = records.length;
        callback(count);
    });
}

最佳答案

(从上方扩展我的评论)

问题在于createPartyId是一个异步函数,但是您试图同步返回该值。那行不通。触摸异步操作后,其余的调用堆栈也必须是异步的。

您不包括调用此代码的代码,但是我想您希望它像这样:

var partyId = createPartyId();
// do stuff...


那是行不通的。尝试这个:

function createPartyId(callback) {
    var min = 10000, max = 99999;
    var partyId = -1, count = -1;
    async.whilst(
        function () { return (count == 0); },
        function (callback) {
            partyId = min + Math.floor(Math.random() * (max - min + 1));
            partyId = 88888;
            getPartyIdCount(partyId, function(err, num) {
                if (!err) {
                    count = num;
                }
                callback(err);
            });
        },
        function (err) {
          // this is called when the loop ends, error or not
          // Invoke outer callback to return the result
          callback(err, count);
        }
    );
}

function getPartyIdCount(partyId, callback) {
    count = -1;
    db.db_name.find({id: partyId}, function(err, records) {
        if(err) {
            console.log("There was an error executing the database query.");
            callback(err);
        }
        count = records.length;
        callback(null, count);
    });
}


(我还采用了始终返回错误的默认node.js约定作为回调函数的第一个参数。)

因此,要使用此功能,您可以执行以下操作:

getPartyId(function (err, num) {
    if (err) { return aughItFellOver(err); }

    // do stuff
});

关于node.js - While循环检查自定义ID的唯一性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24539059/

10-16 20:48