检查用户是否存在于 Rethinkdb 数据库中

Checking if user exists in Rethinkdb database

我正在与 rethinkdb 合作,将用户添加到用户 table。我已经很好地添加了用户,并且在数据资源管理器中看到了正确的数据。我现在有点难过的是,一旦有人添加了新用户名,我如何检查数据库以查看它是否存在,如果存在,则添加新用户。我想我可以从数据库中获取所有当前用户,并根据我要添加的新用户名循环检查他们。这是我正在尝试的:

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 有点陌生,所以我想我做错了。我能得到的任何帮助都会很棒。谢谢你们。

好的。因此,经过一些修补并获得工作伙伴的帮助后,我在进行了一些重大代码更改后使其按预期工作。事实证明,使用 .map() 来遍历用户是我保留 运行 函数的原因,无论名称是否匹配。更好的方法是使用 if (_.size(users) > 0) {} 检查用户。我将 post 下面是对我有用的东西,希望这对以后的其他人有所帮助。

新代码注意事项:

  • 我为我们的连接创建了一个连接函数。
  • 您会在 _.isEmpty(username) 等地方注意到 _。这里我使用的是 Lodash 库。
  • 此处不需要
  • User.getUser(),但它用于查看您在网络选项卡下的浏览器控制台中添加的用户。

工作代码:

function connect() {
    return r.connect({
        host: config.rethinkdb.host,
        port: config.rethinkdb.port,
        db: config.rethinkdb.db
    });
}

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

    const username = _.get(req.body, 'username', '');

    if (_.isEmpty(username)) {
        return res.status(201).json({
            message: 'username cannot be empty'
        });
    }

    return connect()
        .then(connection => {
        return r
        .table('users')
        .getAll(username, { index: 'username'}).run(connection)
        .then((cursor) => cursor.toArray())
        .then((users) => {

            // If user exist return error
            if (_.size(users) > 0) {
                console.log('user already exist');
                return res.status(201).json({
                    message: 'user already exist!'
                });
            };

            Users.create(req.body, (error, user) => {
                if (error) return res.status(500).json({
                    error: error,
                    message: 'Something messed up'
                });

                const userID = user.generated_keys[0];

                Users.getUser(userID, (err, user) => {
                    return res.status(200).json({
                        user: user
                    });
                });
            });
        });
    });
});

很高兴知道你解决了它。但是你正在获取所有用户,将它们暂时放在服务器的内存中,循环遍历每个用户,只是为了检查新用户是否存在!这很慢,耗费内存,而且没有必要。

以下是您可以做得更好的地方:

  1. 将 "users" table 的主键更改为 "username"。 Here is how to do so,您将需要使用选项 primaryKey
  2. 使用下面的 ReQL 插入新用户,这将在 table 仅当用户名不存在时插入新用户:

-

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

一行代码完成:)

或者,如果你只想检查 "username" 是否存在而不插入,你可以这样做:

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