尝试在Node.js和MongoDB中查找唯一标识符,通过创建一个while循环来查询现有ID,直到找到一个唯一的值。如果该ID已经在使用中,则在末尾递增一个数字,直到Mongo返回空值。
一切都正常工作,除了当找到唯一的ID时出现的break语句。Node.js返回:SyntaxError: Illegal break statement
代码如下:
一切都正常工作,除了当找到唯一的ID时出现的break语句。Node.js返回:SyntaxError: Illegal break statement
代码如下:
db.collection('landmarks').findOne({'id':uniqueIDer}, function(err, data){
//if ID exists already
if (data.id){
var uniqueNumber = 1;
while (1) {
var uniqueNum_string = uniqueNumber.toString();
var newUnique = data.id + uniqueNum_string;
db.collection('landmarks').findOne({'id':newUnique}, function(err, data){
if (data.id){
uniqueNumber++;
}
else {
saveLandmark(newUnique);
break;
}
});
}
}
else {
saveLandmark(uniqueIDer);
}
});
我做错了什么?
编辑:
这是修正后的代码,如果有人需要使用异步,请查看:)
db.collection('landmarks').findOne({'id':uniqueIDer}, function(err, data){
if (data){
var uniqueNumber = 1;
var newUnique;
async.forever(function (next) {
var uniqueNum_string = uniqueNumber.toString();
newUnique = data.id + uniqueNum_string;
db.collection('landmarks').findOne({'id':newUnique,'world':worldVal}, function(err, data){
if (data){
console.log('entry found!');
uniqueNumber++;
next();
}
else {
console.log('entry not found!');
next('unique!'); // This is where the looping is stopped
}
});
},
function () {
saveLandmark(newUnique);
});
}
else {
saveLandmark(uniqueIDer);
}
});
.findOne()
中使用同步while (1)
。后者需要引擎处于空闲状态才能完成,而前者永远不会让它处于空闲状态。 - Jonathan Lonowski