Я создал маршрут '/api/checkUsername'
. Какое действие - проверить, существует ли какой-либо пользователь с same username
. Если нет, сохраните новый UserName
в коллекции пользователей и обновите счетчик пользователей в другой коллекции.
Для маршрута у меня есть функция
async function(username) {
IsUserNameExists = await db.findOne({ 'username': username });
if(IsUserNameExists) {
res.send({ message: 'username already exists');
}else{
await user.save() //to save user in DB
await updateUserCount() //update user count in collection 2
res.send({ message: 'user saved successfully' });
}
}
. Это прекрасно работает во всех случаях использования. Но бывает, например, если 2 пользователя ['user1', 'user2'
] проверяют одно и то же имя пользователя eg: Tony_Stark
в одну секунду или с разницей в несколько миллисекунд.
eg
пользователь1 и пользователь2 нажимают /api/checkUsername
одновременно или с разницей в миллисекунды. Пользователь 1 обнаруживает, что имя пользователя Tony_Stark
доступно и сохраняет свое имя пользователя, но в промежутке между сохранением имени пользователя user2 также ищет имя пользователя Tony_Stark
, которое не было сохранено пользователем user1, поэтому это имя пользователя также доступно для user2. Который создает дубликат записи в моей коллекции. Как мне избежать этого?