Мобильное приложение использует сервер синтаксического анализа в качестве внутреннего сервера с mongoDB
в качестве базы данных.
Для каждого пользователя в коллекции User
в коллекции UserProfile
есть профиль пользователя.Профиль пользователя имеет поле указателя в качестве ссылки на User
, к которому принадлежит профиль пользователя.
Проблема заключается в том, что для одного и того же пользователя во время регистрации создается несколько пользовательских профилей.
Это потому, что процесс регистрации выглядит следующим образом:
- Клиент: пользователь регистрируется
- Сервер: создает профиль пользователяв
afterSave
из User
- Клиент: после регистрации вызывает функцию облачного кода
updateProfile
для обновления информации в профиле пользователя - Сервер:
updateProfile
ищет существующий профиль пользователя или создает новый, если его нет
Это вызывает состояние гонки: сервер создает профиль пользователя на шаге № 2 и в то же времяupdateProfile
создает новый профиль пользователя на шаге # 4.Разница во времени в createdAt
этих пользовательских профилей составляет миллисекунды.
Сейчас:
Если я пропущу шаг # 2, то даже если шаг # 4 получит вызовыНесколько раз сразу после этого, это может вызвать состояние гонки, потому что updateProfile
не найдет профиль пользователя, пока он не будет создан.С другой стороны, каждому пользователю необходимо иметь связанный с ним профиль пользователя, поэтому создание его на стороне сервера - единственный способ убедиться в этом.
Если я изменю шаг # 4, насоздайте новый профиль, тогда информация в профиле не обновляется, когда клиент вызывает функцию облачного кода updateProfile
, поскольку профиль пользователя с шага # 1 еще не создан.
Каков правильный подход?
Обновление:
- К сожалению, профиль пользователя не может быть создан на
beforeSave
из User
, потому что у него, похоже, нет ID
еще.Если бы это было возможно, то было бы гарантировано, что профиль пользователя будет создан до , клиент звонит updateProfile
.