Метеор, изменение структуры профиля пользователя приводит к отсутствию граватара и ошибкам console.log

У меня есть пользователи, которые либо загружают свое изображение, либо, если нет, используется граватар.

В первоначальном плане все работает ок. Изображение Gravatar отображается, когда нет загруженных изображений. Я сохранил URL-адрес загруженных изображений (облачный) в поле профиля, profilepicId.

опубликовать

Meteor.publish('allUsers', function() {
    return Meteor.users.find( {}, { 
        fields: { username: 1, profileImg: 1, emails: 1, md5hash: 1, profile: 1 }
    });
});

Ниже представлена ​​структура пользователя (исходный рабочий код):

username,
emails,
password,
profile : { profilepicId: {} }

Регистрация нового пользователя (оригинальный рабочий код):

Accounts.createUser({         //thats all I can add based on docs
   username  : usernameVar,
   email     : emailVar,
   password  : passwordVar,
   profile   : { }

//and then to extend the user fields
Accounts.onCreateUser(function(options, user) { 
   if(options.profile) {
      user.profile = options.profile || {};
   }
   user.md5hash = Gravatar.hash(user.emails[0].address); 
   return user;
});

Затем в html показать изображение:

{{#if profile.profilepicId}} 
   <a href="{{pathFor 'upload'}}" class="link">
      <img src="{{c.url profile.profilepicId format=format gravity='faces' mode='thumb' crop='thumb' width=60 height=60}}">
   </a>
{{else}} 
   <!-- the uploaded image --> 
{{/if}}




И изменения.... Итак, теперь вместо сохранения загруженного изображения в profile: { profilepicId : {}} я сохраняю его вне поля profile. Я не удалял профиль по умолчанию в пользовательской структуре Meteor.

username,
emails,
password,
profileImg :{ social : {} , uploaded: {}}

И изменения отражаются в Accounts.OnCreateUser:

Accounts.onCreateUser(function(options, user) { 
   user.profileImg = { social : {}, uploaded: {} }
   user.md5hash = Gravatar.hash(user.emails[0].address); 
   return user;
}); 

HTML-код загруженных изображений также изменится с profile.profilepicId на profileImg.uploaded. Однако это не имеет значения, поскольку граватар, который не отображается, не требует строки для загрузки html.

Это все изменения, которые я сделал. Нет изменений для публикации тоже. В журнале консоли нет сообщений об ошибках, и я сузил отсутствующий граватар до этого изменения структуры пользователя. Может ли кто-нибудь объяснить мне, почему это так?


person Thinkerer    schedule 13.05.2017    source источник
comment
Существуют ли нужные поля в документах на стороне сервера? А на стороне клиента (проверить в консоли)?   -  person MasterAM    schedule 13.05.2017
comment
Привет, нужные поля - это просто пустые массивы (до загрузки изображений). Если смотреть через пакет Савин Монгол, то поля есть. Поле md5hash, созданное извне, также существует. Однако каким-то образом пользователь не определен, если я изменяю структуру информации о пользователе.   -  person Thinkerer    schedule 13.05.2017
comment
Я не понимаю, где пользователь не определен. Кроме того, как вы сохраняете URL-адрес изображения после его загрузки (например, метод или попытка обновить коллекцию с клиента)? Мне не совсем понятно, что точно не так. Может быть, дело в том, что теперь ваше условие profileImg.uploaded кажется всегда истинным.   -  person MasterAM    schedule 13.05.2017
comment
Итак, если вы загрузили изображение, оно будет сохранено как облачный URL-адрес в profileImg.uploaded. Однако я даже ничего не загружаю, и граватар не появляется, несмотря на существование md5hash.   -  person Thinkerer    schedule 13.05.2017
comment
но ваш шаблон проверяет {{#if profileImg.uploaded}}, что, судя по всему, верно.   -  person MasterAM    schedule 13.05.2017
comment
{{#if }} возвращает true, только если я что-то загрузил в поле. Поэтому, если загрузки нет, он возвращает false и вместо этого показывает gravatar. Во всяком случае, эта часть работает правильно. Без вопросов. Проблема в том, что граватар не появляется и показывает пустое место.   -  person Thinkerer    schedule 13.05.2017
comment
Что заставляет вас это предполагать? Если я правильно понял, что вы изменили, поле по умолчанию является (пустым) объектом и, следовательно, правдивым. Кстати, я нигде не вижу массивов (о которых вы упомянули в предыдущем комментарии). Если вы можете сделать это более понятным, я бы посоветовал добавить в вопрос текущую выборку данных и перенести шаблон, вывод разметки и ожидаемый вывод.   -  person MasterAM    schedule 13.05.2017


Ответы (1)


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

Рассматривайте профиль как отдельную коллекцию профилей, над которой у вас есть полный контроль, как в socialize. .

person StorytellerCZ    schedule 13.05.2017
comment
Да, но если вы читаете то, что я написал ... рабочая версия - это та, которая использует профиль. Я пытался изменить, но это не работает. - person Thinkerer; 13.05.2017
comment
Да, это правильно, поле профиля доступно для записи, все, что находится за его пределами, недоступно для записи вам, если вы не используете определенные функции, предоставляемые пакетом учетных записей Meteor. Поэтому, как только вы поместите свое поле profileImg за пределы поля профиля, оно будет отклонено сервером. - person StorytellerCZ; 13.05.2017
comment
Итак, какие варианты, если я не могу поместить его вне профиля, и я не должен использовать профиль? не могу двигаться ни вперед, ни назад! ржу не могу - person Thinkerer; 13.05.2017
comment
Вы можете использовать профиль, но рекомендуется создать новую коллекцию, в которой вы будете хранить профили пользователей. Мой создается с помощью пакета socialize:user-profile: github.com/copleykj/socialize-user-profile/blob/master/server/ - person StorytellerCZ; 13.05.2017
comment
Как получилось, что я могу создать новое поле для md5hash, но не то же самое для изображения профиля? Документы мало помогают. Я только недавно узнал, что Accounts.createUser нельзя добавлять поля, это нужно делать на Accounts.OnCreateUser. В этом случае все должно быть в профиль? - person Thinkerer; 13.05.2017
comment
Этот ответ неточен и не решает проблему ОП. Профиль, который по умолчанию доступен для записи, при желании можно легко исправить, больше ничего особенного в нем нет (и вы должны сделать это, даже если вы его не используете). Любое поле может быть добавлено в коллекцию users с сервера с помощью методов или других основных крючков API, таких как onCreateUser. - person MasterAM; 13.05.2017