我正在与rethinkdb一起将用户添加到用户表中。我已经很好地添加了用户,并且在数据浏览器中看到了正确的数据。现在让我有些困惑的是,一旦有人添加了新用户名以查看其是否存在,以及如果存在,则添加新用户,如何检查数据库。我以为我可以从数据库中获取所有当前用户,然后针对我要添加的新用户名循环检查它们。这是我正在尝试的:

router.post('/signup', (req, res) => {

    let newUser      = req.body.username,
        currentUsers = [];

    r.db('base').table('users')
    .then((users) => {
        users.forEach((user) => {
            currentUsers.push(user.username)
        });
    }).then(() => {

        if (currentUsers.length === 0) {
            addUser(req.body);
        }

        currentUsers.forEach((name) => {

            if (newUser !== name) {
                console.log('new user added!');
                addUser(req.body);
            }

            if (newUser === name) {
                console.log('user exists!');
            }

        }); // end forEach()

    }); // end last .then()


    function addUser(user) {
        Users.create(user, (error, response) => {
            if (error) return res.end();
        });
    } // end addUser(user)


}); // end router.post()


我的想法过程是在数据库中为空,请调用addUser函数添加第一个用户名。效果很好,但是当我尝试添加多个新用户时,情况就变得有些奇怪了。说我在数据库中有用户名Dan。如果我尝试再次添加Dan,它将在不应该运行的时候运行addUser函数,并且控制台会同时显示两条消息:

user exists!
new user added!


每当我尝试添加新用户时,它还将开始两倍和三倍等等数据库名称。我在这里做错了什么?我对rethinkdb有点陌生,所以我想我只是以错误的方式进行了此操作。我能得到的任何帮助都会很棒。谢谢你们。

最佳答案

很高兴知道您已解决问题。但是,您要获取所有用户,将它们临时放置在服务器的内存中,并遍历每个用户,只是要检查新用户是否存在!这很慢,消耗内存,而且不必要。

这是您可以做得更好的:


将“用户”表的主键更改为“用户名”。 Here is how to do so,您将需要使用选项primaryKey
使用下面的ReQL插入新用户,仅当用户名不存在时,该新用户才会在表中插入新用户:


--

r.db("my_db").table("users").insert(newUser, {conflict: "error"});


所有这些代码都在一行中完成:)

或者,如果仅需要检查“用户名”是否存在而无需插入,则可以执行以下操作:

r.db("my_db").table("users").filter({username: newUserName}).count().eq(1);

10-05 21:06
查看更多