如何通过在数据库中反复检查来生成唯一的用户名?

问题描述 投票:0回答:1

我正在编写一个为每个新用户生成唯一用户名的函数。首先,分配一个与用户全名匹配的用户名,然后检查数据库中是否存在该用户名。如果存在,则向其添加一些数字,然后再次检查,直到找到数据库中不存在的新用户名为止。

下面是相同的代码

var generateUsername = function(name){
                var username = name;
                console.log(username);
                var isUsername;
                var number = 0;
                db.collection("users").where("username", "==", username)
                .get()
                .then(function(querySnapshot) {
                    if(querySnapshot.empty){
                        isUsername = false;
                    }
                    else {
                        isUsername = true;
                    }

                    while(isUsername == true){
                        number++;
                        username = fullName + number;
                        console.log(username);
                        db.collection("users").where("username", "==", username)
                        .get()
                        .then(function(querySnapshot) {
                            if(querySnapshot.empty){
                                isUsername = false;
                            }
                            else {
                                isUsername = true;
                            }
                        })
                        .catch(function(error) {
                            console.log("Error getting documents: ", error);
                        });
                    }
                })
                .catch(function(error) {
                    console.log("Error getting documents: ", error);
                });
            }

这没有给我想要的输出。循环无限运行。我在哪里做错了?

javascript firebase google-cloud-firestore es6-promise
1个回答
0
投票

因此,在提出andy mccullough建议之后,我想出了以下解决方案

var generateUsername = function(name){
                var username = name;
                var isUsername;
                var number = 0;
                db.collection("users").where("username", "==", username).get()
                .then(function(querySnapshot) {
                    if(querySnapshot.empty){
                        isUsername = false;
                    }
                    else {
                        isUsername = true;
                    }
                    (async function loop(){
                        while(isUsername == true){
                            number++;
                            username = name + number;
                            var querySnapshot = await db.collection("users").where("username", "==", username).get();
                            if(querySnapshot.empty){
                                isUsername = false;
                            }
                            else {
                                isUsername = true;
                            }
                        }
                        console.log(username);
                    })();

                })
                .catch(function(error) {
                    console.log("Error getting documents: ", error);
                });
            }

必须等待循环功能,直到数据库返回一个承诺。使用异步等待可以实现。您可以参考此答案以获取更多详细信息JavaScript ES6 promise for loop

© www.soinside.com 2019 - 2024. All rights reserved.