我有一个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/