knex仅添加不存在的用户名

时间:2018-09-08 00:39:24

标签: javascript postgresql knex.js

我正在使用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相当陌生。

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

1 个答案:

答案 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;
});