knex только добавляет имя пользователя, если оно еще не существует - PullRequest
0 голосов
/ 08 сентября 2018

Я использую knex. Хотите простой способ проверить, существует ли имя пользователя в БД. Если это так, верните сообщение об ошибке («имя пользователя уже существует»). Если нет, то вставьте.

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 и обещаниях.

  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')
    }
    

1 Ответ

0 голосов
/ 10 сентября 2018

Для этого нет функции KNEX для одного выстрела. Если у вас есть уникальное ограничение на имя пользователя (как вы должны), тогда вы можете сделать вставку и поймать, если это не удалось. Сообщение об ошибке будет отправлено в обработчик перехвата.

Лучше было бы сначала сделать выбор и попытаться вставить, только если он еще не существует, в противном случае вернуть сообщение об ошибке перед попыткой вставки.

Обновленный ответ на обновленный вопрос: Обещание 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;
});
...