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

时间:2017-05-17 22:42:48

标签: javascript foreach rethinkdb

我正在使用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有点新意,所以我想我只是以错误的方式做到了这一点。我能得到的任何帮助都会很棒。多谢你们。

2 个答案:

答案 0 :(得分:2)

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

以下是你可以做得更好的事情:

  1. 更改"用户"的主键table to" username"。 Here is how to do so,您需要使用primaryKey选项。
  2. 使用以下ReQL插入新用户,只有当用户名不存在时,才会在表格中插入新用户
  3. -

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

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

    或者,如果你想要的只是检查"用户名"没有插入就存在,你可以这样做:

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

答案 1 :(得分:0)

好的。因此,经过一些修补工作并获得工作伙伴的帮助后,我在一些重要的代码更改后按预期工作。事实证明,使用.map()循环遍历这样的用户是我继续运行该函数的原因,无论名称是否匹配。更好的方法是使用if (_.size(users) > 0) {}检查用户。我将在下面发布对我有用的内容,希望这将有助于其他人。

新代码中需要注意的事项:

  • 我为连接创建了一个connect函数。
  • 您会在_等地方发现_.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
                    });
                });
            });
        });
    });
});