while循环来检查自定义id的唯一性

我有一个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是一个asynchronous函数,但你试图同步返回值。 这是行不通的。 一旦你触及asynchronous操作,调用堆栈的其余部分也必须是asynchronous的。

你不包括调用这个的代码,但是我认为你希望它是这样的:

 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约定作为callback函数的第一个参数。)

所以,要使用这个你会做:

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

首先,有什么特别的原因,你不使用简单的数字增量序列? 这种types的代码很容易效率低下,产生的数字越多,发生冲突的可能性就越大,这意味着您将花费更多的时间为您的数据生成ID,而不是处理其余的处理。 不是一个好主意。

但我仍然可以告诉你什么是错的。

好的,所以getPartyIdCount()将永远不会失败,返回undefined(或者,基本上什么也不是)。

您的mongo调用在callback中处理返回值,并且该callback函数不会将其值赋给任何东西,所以return records.length就会变成虚无。

你混淆了createPartyId() ,它看起来你想同步运行,你的mongo调用,它必须asynchronous运行。

return总是与最近的包含function ,所以在这种情况下,它将与function(err, records) ,而不是function getPartyIdCount(partyId)