Убедитесь, что Meteor.user () доступен на клиенте после входа в систему

1

Я нашел эту странную проблему, и она выглядит тихой патогенной!

Несмотря на то, что Meteor.user() всегда будет доступен после входа в систему, но я вижу, что он не является надежным вообще, поскольку он часто возвращает undefined.

После ссылки на некоторые вопросы SO, похоже, что Meteor.user() может не загружаться полностью из-за "проблем с синхронизацией".

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

Теги:
meteor

2 ответа

5

Meteor.user() всегда будет полностью загружен клиентом после входа через некоторое время. Не очень долгое время в зависимости от размера самого пользовательского объекта, задержки и полосы пропускания, обычно от 1 мс до 100 мс. Вам нечего делать, чтобы обеспечить его загрузку - вам просто нужно учитывать задержку, ожидая, пока она не будет загружена, чтобы запустить код, который зависит от него. Например, вы можете использовать Tracker.autorun(), чтобы запустить что-то, как только Meteor.user() станет доступным:

на клиенте:

Tracker.autorun(() => {
  if (Meteor.user()) {
    ... do the thing that depends on Meteor.user()
  }
});

В вспомогательном или каком-либо другом коде рендеринга, который обычно требуется для защиты кода, например:

const username = Meteor.user() && Meteor.user().username;

никогда не сломается. Он просто вернется не определен, если пользователь не зарегистрирован или пользовательский объект еще недоступен.

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

  • 0
    Но я не могу использовать Tracker.autorun () в помощниках шаблонов! что бы я там использовал?
  • 0
    И я только что заметил, что Meteor.users также не всегда доступен сразу. Итак, каков рекомендуемый подход, чтобы сделать что-то, что зависит от Meteor.user (s) в помощниках шаблонов
0

Как упоминалось @michel-floyd, вы можете использовать Tracker.autorun(() => {/*..*/}); , Однако использование глобального помощника может быть лучшим вариантом.

Но согласно вашему конкретному вопросу:

Мне нужен надежный способ убедиться, что Meteor.user() полностью загружен на клиенте.

Использование Accounts.onLogin будет более эффективным:

import { Accounts } from 'meteor/accounts-base';

Accounts.onLogin(() => {
  // User is logged in and its data fully loaded
});
  • 0
    Вы уверены, что Meteor.user() доступен в этом Meteor.user() ? Документы не упоминают об этом.
  • 0
    @MichelFloyd да, и он представлен в тестах

Ещё вопросы

Сообщество Overcoder
Наверх
Меню