nodejs,mongoose寻找导致无限循环的唯一令牌

时间:2017-07-31 18:21:41

标签: javascript node.js mongoose

我正在尝试生成令牌集合中不存在的随机令牌。所以,我正在使用这张支票:

var foundToken = false;
var token;
while (!foundToken){
    token = randomstring.generate(15);
    Tokens.findOne({key: token}, function(err,res){
        if (err){
            console.log(err);
        }
        if (!res){
            foundToken = true;
        }
    });
}

但是,在运行它时,即使Tokens集合为空,也会在无限循环中生成randomstrings。

为了使事情恶化,如果我删除了第二个条件,即

var foundToken = false;
var token;
while (!foundToken){
    token = randomstring.generate(15);
    Tokens.findOne({key: token}, function(err,res){
        if (err){
            console.log(err);
        }
        foundToken = true;
    });
}

它仍会导致无限循环,因此回调甚至不执行。顺便说一下,我已经检查了randomstrings,它们完全不同。

1 个答案:

答案 0 :(得分:2)

findOne是一个异步操作。异步操作和循环不能很好地配合在一起。将查询放在带有回调参数的单独方法中,不要使用while循环。

var token;

getToken(function(generatedToken) {
    token = generatedToken;

    // proceed with your code
});

function getToken(callback) {
    var token = randomstring.generate(15);

    Tokens.findOne({key: token}, function(err,res){
        if (res === null) {
            // success, the token does not exist
            callback(token);
        } else {
            // token exists, try again
            getToken(callback);
        }
    });
}

另请查看Promises,以避免以callback hell结尾。