我正在使用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有点新意,所以我想我只是以错误的方式做到了这一点。我能得到的任何帮助都会很棒。多谢你们。
答案 0 :(得分:2)
很高兴知道你解决了它。但是你要取出所有用户,暂时将它们放在服务器的内存中,循环遍历每个用户,只是为了检查新用户是否存在!这很慢,耗费内存,而且不必要。
以下是你可以做得更好的事情:
primaryKey
选项。-
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) {}
检查用户。我将在下面发布对我有用的内容,希望这将有助于其他人。
新代码中需要注意的事项:
_
等地方发现_.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
});
});
});
});
});
});