如何在创建唯一的MongoDB字段值之前递归,然后插入具有新值的新文档

时间:2016-11-23 22:48:15

标签: javascript node.js mongodb recursion stormpath

我正在尝试使用递归函数(下面)来检查" bob"已经是我的MongoDB中的用户,如果是,则稍微改变它直到它是唯一的,然后将文档插入我的数据库。

function changeName(x){
    MongoClient.connect(URI, function(err, db){
        db.collection('users').findOne({"user": x}, function(err, result){
            if (err) throw err;
            if (result && result.user == x){
                console.log("match found: " + result.user + " =  " + x + 
                "\n ...changing name...");
                //change name:
                x += Math.floor(Math.random()*9);
                changeName(x);
            }
            console.log("x = " + x);
            console.log("no match!");
            return x;
        });
    });
}

如果找到匹配项,上面的函数会更改名称,即changeName("bob");可能会将其更改为" bob7",但我需要运行一个带有新名称的回调函数,然后使用新名称作为用户名值创建一个新文档。

有没有办法可以使用回调函数但不能在递归中使用?

背景资料:

我正在使用Stormpath进行我的网站用户身份验证,并为Google和Facebook设置了社交登录功能。它工作得很好,但我想略微修改它。通过社交登录,帐户的用户名将自动成为与用户用于登录的帐户关联的电子邮件地址。

在我的应用中,用户名是面向公众的,因此我不想显示人们的电子邮件地址,但我喜欢用户体验Stormpath社交登录时的即时登录。

所以,在我的Stormpath postLogin处理程序中,我正在清除@符号及其之后发生的任何事情。

正如您可能已经猜到的那样,问题在于有人可能会尝试注册并且他们有" bob@gmail.com"作为他们的Google帐户,但有人可能已使用用户名" bob"在我的网站上注册。

为了了解我在postLogin处理程序中所做的事情,这是伪代码:

if(document found with that name){
    if(document found with that name and that email){
        //this is an existing user account, loggin in..
    }else{
        //name already taken, changing name...
    }

}else{
    //no document found with that user name, creating a new user account...
}

0 个答案:

没有答案