@HitGirl

Как правильно добавить запись в коллекцию, чтобы не возникло ошибки дублирования ключей?

Здравствуйте!
Есть следующий код, который перед регистрацией пользователя проверяет существует ли другой пользователь с таким login:
const candidate = await UserModel.findOne({login})
        if (candidate) {
            throw ApiError.BadRequest(`Пользователь с логином ${login} уже существует`)
        }
const user:UserDocument = await UserModel.create({login, email, password: hashPassword, activationLink});

Однако, проверка на дубликат и создание нового пользователя происходит не сразу. В теории может возникнуть гонка пользователей при регистрации.
Искусственный фрагмент кода, показывающий проблему:
const candidate = await UserModel.findOne({login})
let user:UserDocument;
        if (password==='start')
            setTimeout(async ()=> {user = await UserModel.create({login, email, password: hashPassword, activationLink})}, 20000)
        else
            user = await UserModel.create({login, email, password: hashPassword, activationLink})

В данном примере, примерно в одно время регистрируются пользователи: {login: "root", email: "example@email.ru", password: "start"} и {login: "root", email: "my-mail@email.ru", password: "end"}. Регистрацию пройдёт второй пользователь, а через 20 секунд, будет получена ошибка: UnhandledPromiseRejectionWarning: MongoServerError: E11000 duplicate key error collection. Вопрос: стоит ли запариваться по этому поводу (вероятность таких ситуаций очень низкая), и если да как их можно избежать, или хотя бы отследить (чтобы отправить сообщение первому пользователю)?
  • Вопрос задан
  • 59 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы