Node.js с express.js.Пользователи могут зарегистрироваться, используя одни и те же данные дважды, если они отправляют запросы на публикацию достаточно быстро - PullRequest
0 голосов
/ 07 мая 2019

Я использую Node.js с платформой express.js поверх нее и базой данных MySql.

У меня есть конечная точка для регистрации, которая принимает 3 параметра: Электронная почта, имя пользователя и пароль
Затем он запрашивает базу данных, используя SELECT, чтобы узнать, были ли введены имя пользователя или адрес электронной почты. И если нет, он продолжает хешировать пароль, создать новую строку в базе данных, отправить подтверждение по электронной почте и так далее.

Проблема заключается в том, что кто-то быстро отправляет два почтовых запроса, поскольку для обработки вставки данных в запрос требуется некоторое время, чтобы два пользователя имели одно имя пользователя / адрес электронной почты.
По сути, происходит то, что второй запрос запрашивает базу данных до того, как первый запрос даже вставит данные (новый пользователь), и, следовательно, результаты, возвращаемые вторым запросом, состоят в том, что имя пользователя и электронная почта свободны.

Мне было интересно, как я могу предотвратить подобные проблемы в будущем.

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

В таких условиях гонки местом, где доллар должен остановиться, является сама база данных.Таким образом, вы должны добавить уникальное ограничение в поле username, если у вас его еще нет:

ALTER TABLE users ADD CONSTRAINT username_unique UNIQUE (username);

Что произойдет сейчас, если два потока будут введены практически одновременно,каждый запрос будет проходить через код.Но только один запрос получит блокировку для записи новой пользовательской записи в таблицу.Другой запрос завершится неудачно с ошибкой базы данных, которую ваше Node-приложение должно отловить.

Обратите внимание, что вам также может потребоваться уникальное ограничение для поля электронной почты.

0 голосов
/ 07 мая 2019

Вместо того, чтобы вносить изменения в схему, я предлагаю вам разобраться с этим в своем приложении APP.
Использование мьютекс-блокировок - идеальный подход к решению подобных проблем. Существуют различные пакеты, такие как redlock и т. Д., Для решения этих проблем, хотя для работы redlock требуется redis. Существуют и другие модули, которые не требуют повторной установки.
Также есть чтение Mutex блокировки в узле

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...