我正在使用knex。想要一种简单的方法来检查用户名是否存在于db中。如果是这样,则返回错误消息(“用户名已存在”)。如果没有,则插入。
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(()=>{})
})
已更新 好的,所以我的程序按预期工作。仅在表中不存在用户名和电子邮件时才插入。但是,编写此代码时有两个问题。
请注意,我对knex库和Promise相当陌生。
我的if / else语句最终总是同时运行两个命令,但是,如果存在电子邮件或用户名,则它永远不会插入DB。但是,即使没有插入,我也总是看到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')
}
答案 0 :(得分:3)
没有为此而设的一次性拍摄功能。如果您对用户名有唯一的约束(如应有的话),则可以在用户名失败时进行插入和捕获。失败消息将发送到catch处理程序中。
更好的做法是先进行选择,然后仅在尚不存在的情况下尝试插入,否则在尝试插入之前返回错误消息。
已更新问题的更新答案:
insertUser
承诺在创建后即会执行,因此您总是要插入用户(如果违反唯一约束则失败)。
您的变量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;
});