ошибка проверки мангуста возникает, даже если задано обязательное поле

#javascript #mongodb #function #mongoose

#javascript #mongodb #функция #mongoose

Вопрос:

     // Assign unique krypter id
    assignKrypterID = () => 
    {
      let id = Math.floor(Math.random()*(999999-100000) 100000);
      console.log(id);
      Krypter
        .findOne({krypter_id: id.toString()})
        .then(krypter => {
          if (krypter)
            assignKrypterID()
          else
            return id.toString()
        })
        .catch(err => console.log(err))
    }

    const newKrypter = new Krypter({
      handle: req.body.handle,
      password: req.body.password, // plain text
      krypter_id: assignKrypterID()
    });

    // Hashes the plaintext password and saves it
    bcrypt.genSalt(10, (err, salt) => {
      bcrypt.hash(newKrypter.password, salt, (err, hash) => {
        if (err) throw err;
        newKrypter.password = hash; // encrypted password
        newKrypter
          .save()
          .then(krypter => res.json(krypter))
          .catch(err => console.log(err));
      })
    });
  

Я попытался присвоить уникальный 6-значный идентификатор каждому пользователю во время регистрации, используя функцию ‘assignKrypterID()’. Но получается следующая ошибка:

Получена ошибка

Это моя схема:

 const KrypterSchema = new Schema({
  handle: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true
  }, 
  krypter_id: {
    type: String,
    required: true
  }
});
  

Разве этого нельзя достичь с помощью рекурсии? Или рекурсия здесь плохой ход?

Помогите мне, как изменить это, чтобы определить, присвоен ли случайно сгенерированный идентификатор объекту.

Комментарии:

1. Краткое примечание: лучше скопировать вставленный текст, а не публиковать скриншот. (Доступность, поисковые системы, удобное копирование / вставка …)

2. assignKrypterID() функция ничего не возвращает. я предполагаю, что реализация функции неверна, вы не должны рекурсивно запрашивать mongodb, это довольно тяжело, вместо этого вы должны найти все идентификаторы сразу и выполнить поиск в массиве идентификаторов. Также лучше использовать async / await вместо выполняемых обещаний.

Ответ №1:

 assignKrypterID = async() => {
  try {
    let krypter_ids = await Krypter.find({}).map(obj => obj.krypter_id)
    let flag = true
    while (flag) {
      let id = Math.floor(Math.random() * (999999 - 100000)   100000);
      console.log(id);
      if (krypter_ids.includes(id)) {
        continue;
      } else {
        flag = false
        return id.toString()
      }
    }
  } catch (err) {
    throw err
    console.log(err)
  }
}
async function foo() {
  try {
    let krypter_id = (await assignKrypterID()) || ""
    const newKrypter = new Krypter({
      handle: req.body.handle,
      password: req.body.password, // plain text
      krypter_id: krypter_id
    });

    // Hashes the plaintext password and saves it
    let salt = await bcrypt.genSalt(10)
    let hash = await bcrypt.hash(newKrypter.password, salt)
    newKrypter.password = hash; // encrypted password
    let krypter = await newKrypter.save()
    res.json(krypter)
  } catch (err) {
    console.log(err)
    throw err
  }

}

foo()