我正在与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);