Здравствуйте!
Есть следующий код, который перед регистрацией пользователя проверяет существует ли другой пользователь с таким 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. Вопрос: стоит ли запариваться по этому поводу (вероятность таких ситуаций очень низкая), и если да как их можно избежать, или хотя бы отследить (чтобы отправить сообщение первому пользователю)?