2015-05-04 3 views
0

Я строю систему управления списком друзей с Meteor.js.Метеор: обновление коллекции сбой

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

Вот мой код. Я получаю другой пользователь _id и profile.name, соответственно, в e.target.id и e.target.name.

Template.talkers.events({ 
    "click .addTalker": function(e, tmpl){ 
    /* Checking if there already is a pending request */ 
    var bool = false; 
    for(var i = 0; i < Meteor.user().profile.friends.length; i++){ 
     if(Meteor.user().profile.friends[i].id == id){ 
     bool = false; 
     }else{ 
     bool = true; 
     break; 
     } 
    } 

    /* If there isn't */ 
    if(!bool){ 

     /* I add the other user in my friend list with a pending status */ 
     Meteor.users.update({_id: Meteor.userId()}, { 
     $push: {'profile.friends': { 
      id: e.target.id, 
      status: 0 
      } 
     } 
     }); 

     /* Then, I add the request on the other user profile */ 
     Meteor.users.update({_id: e.target.id}, { 
     $set: {'profile.friends': { 
      id: Meteor.userId(), 
      status: 2 
      } 
     } 
     }); 

     /* And I create a new notification for the other user */ 
     var notifId = Meteor.users.findOne({_id: e.target.id}).profile.notifications.length; 
     console.log(notifId + 1); 
     Meteor.users.update({_id: e.target.id}, { 
     $push: {'profile.notifications': { 
      id: (notifId + 1), 
      type: 1, 
      img: null, 
      link: "/profile"}, 
     } 
     }); 
     alert("An invitation has been sent to " + e.target.name) 
    } 
    } 
    }); 
} 

Проблема заключается в том, что, если я правильно добавить другого пользователя в список друзей, с ожидающим статусом, я получаю ту же ошибку бросили два раза за два обновления на другого пользователя. На данный момент я публикую _id и некоторые данные из профиля всех пользователей клиенту. Я предполагаю, что проблема связана с тем, что я не могу переопределить другой профиль пользователя от клиента, но только для его чтения. Тогда, я думаю, я должен сделать это на стороне сервера с вызовом метода?

Можете ли вы подтвердить мою проблему или объяснить мне, как действовать дальше?

Спасибо Вам

ответ

1

Да, отсутствие разрешений на обновления других пользователей, вероятно, проблема здесь. Оттуда, у вас есть два варианта:

  1. Используйте метод сервера, чтобы выполнить обновление для вас, как вы сказали (рекомендуется)
  2. Если вы доверяете своим пользователям (в большинстве случаев, по моему скромному мнению: Дон» t), вы можете allow разрешений на обновление для Meteor.users на условиях, которые вы желаете. Затем вы сможете поддерживать свои вызовы обновления в клиенте.
+0

Тогда я собираюсь сделать это на стороне сервера. Но, мне любопытно: есть ли преимущество, позволяющее пользователям делать это на стороне сервера? Что-то программирующее? Или их нет? Даже для других коллекций, чем пользователи(), например, почему я предпочитаю, чтобы мои пользователи меняли коллекцию аватаров, загружая изображения, а не передавая их серверной стороне, чтобы сделать то же самое более безопасным способом? На мой вопрос, я думаю, ответ: разрешение действий стороне клиента позволяет разделить работу и разрешить серверу «отдыхать» или, по крайней мере, работать меньше. Но это была бы единственная цель? –

+0

Я предполагаю, что если вы используете это приложение только с доверчивыми людьми (то есть: друзьями), то разрешая клиентам обновлять других пользователей, он делает код более чистым и не добавляет сложности: ваша логика не разделяется между файлами сервера и клиента, вы вам не нужно дважды проверять исключения ... Также я думаю, что он должен * работать лучше, так как у вас есть только одна функция асинхронизации ... (которая по-прежнему запрашивает сервер, конечно) – SylvainB

+0

Спасибо вам за помощь! –

Смежные вопросы