knex 仅在用户名不存在时添加用户名
knex only add username if it doesn't already exist
我正在使用 knex。想要一种简单的方法来检查用户名是否存在于数据库中。如果是,return 错误消息 ("username already exists")。如果没有则插入。
router.post('/register', (req, res) => {
const username = req.body.username;
const email = req.body.email;
const password = req.body.password;
knex('users')
.insert([{
username: req.body.username,
email: req.body.email,
password: bcrypt.hashSync(req.body.password, 10)
}]).then(()=>{})
})
已更新
好的,我的程序按预期工作。仅当 table 中不存在用户名和电子邮件时才插入。但是,我在编写这段代码时遇到了两个问题。
请注意,我对 knex 库和 promises 还很陌生。
- 性能,我的整个应用变慢了
我的 if/else 语句总是以 运行 这两个命令结束,但是,如果电子邮件或用户名存在,它永远不会插入数据库。但是我总是看到 console.log 即使它没有插入。
const insertUser = knex('users')
.returning('id')
.insert([{
username: req.body.username,
email: req.body.email,
password: bcrypt.hashSync(req.body.password, 10)
}]).then(userNameValid => {console.log(userNameValid)})
const validityCheck = knex.select("username")
.from("users")
.where("username", username)
.andWhere("email", email)
.then(userNametList => {
console.log(userNametList)
})
if (!validityCheck){
return insertUser;
} else if (validityCheck !== null){
return console.log('Username or email is already in use')
}
没有一次性的 knex 功能。如果您对用户名有唯一约束(正如您应该的那样),那么您可以插入并在失败时捕获。失败消息将进入捕获处理程序。
更好的做法是先执行 select 并且仅在插入不存在时才尝试插入,否则 return 在尝试插入之前会出现错误消息。
更新问题的更新答案:
insertUser
promise 在创建时执行,因此您始终插入用户(如果违反唯一约束则失败)。
您的变量 validityCheck
是一个承诺,因此 !validityCheck
将始终是 false
。
您要做的是在有效性检查的 .then( ...)
块中创建插入用户承诺...
knex.select("username")
.from("users")
.where("username", username)
.andWhere("email", email)
.then(userNametList => {
if (userNameList.length === 0) {
return knex('users')
.returning('id')
.insert([{
username: req.body.username,
email: req.body.email,
password: bcrypt.hashSync(req.body.password, 10);
}])
.then((newUserId) => {
console.log('inserted user', newUserId);
});
}
console.log('not inserting user');
return;
});
我正在使用 knex。想要一种简单的方法来检查用户名是否存在于数据库中。如果是,return 错误消息 ("username already exists")。如果没有则插入。
router.post('/register', (req, res) => {
const username = req.body.username;
const email = req.body.email;
const password = req.body.password;
knex('users')
.insert([{
username: req.body.username,
email: req.body.email,
password: bcrypt.hashSync(req.body.password, 10)
}]).then(()=>{})
})
已更新 好的,我的程序按预期工作。仅当 table 中不存在用户名和电子邮件时才插入。但是,我在编写这段代码时遇到了两个问题。
请注意,我对 knex 库和 promises 还很陌生。
- 性能,我的整个应用变慢了
我的 if/else 语句总是以 运行 这两个命令结束,但是,如果电子邮件或用户名存在,它永远不会插入数据库。但是我总是看到 console.log 即使它没有插入。
const insertUser = knex('users') .returning('id') .insert([{ username: req.body.username, email: req.body.email, password: bcrypt.hashSync(req.body.password, 10) }]).then(userNameValid => {console.log(userNameValid)}) const validityCheck = knex.select("username") .from("users") .where("username", username) .andWhere("email", email) .then(userNametList => { console.log(userNametList) }) if (!validityCheck){ return insertUser; } else if (validityCheck !== null){ return console.log('Username or email is already in use') }
没有一次性的 knex 功能。如果您对用户名有唯一约束(正如您应该的那样),那么您可以插入并在失败时捕获。失败消息将进入捕获处理程序。
更好的做法是先执行 select 并且仅在插入不存在时才尝试插入,否则 return 在尝试插入之前会出现错误消息。
更新问题的更新答案:
insertUser
promise 在创建时执行,因此您始终插入用户(如果违反唯一约束则失败)。
您的变量 validityCheck
是一个承诺,因此 !validityCheck
将始终是 false
。
您要做的是在有效性检查的 .then( ...)
块中创建插入用户承诺...
knex.select("username")
.from("users")
.where("username", username)
.andWhere("email", email)
.then(userNametList => {
if (userNameList.length === 0) {
return knex('users')
.returning('id')
.insert([{
username: req.body.username,
email: req.body.email,
password: bcrypt.hashSync(req.body.password, 10);
}])
.then((newUserId) => {
console.log('inserted user', newUserId);
});
}
console.log('not inserting user');
return;
});