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 还很陌生。

  1. 性能,我的整个应用变慢了
  2. 我的 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;
});