Личные сообщения Meteor между пользователями

#meteor

#метеор

Вопрос:

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

Сервер выглядит следующим образом:

 // .. lot of code
Meteor.publish("privateMessages", function () {
    return PMs.find({ to: this.userId });
});
PMs.allow({
    insert: function(user, obj) {
        obj.from = user;
        obj.to = Meteor.users.findOne({ username: obj.to })._id;
        obj.read = false;
        obj.date = new Date();
        return true;
    }
});
// .. other code
  

Когда пользователь подписывается на privateMessages, он получает объект mongo, который выглядит следующим образом:

 { "to" : "LStjrAzn8rzWp9kbr", "subject" : "test", "message" : "This is a test", "read" : false, "date" : ISODate("2014-07-05T13:37:20.559Z"), "from" : "sXEre4w2y55SH8Rtv", "_id" : "XBmu6DWk4q9srdCC2" }
  

Как я могу изменить объект, чтобы возвращать имя пользователя вместо идентификатора пользователя?

Ответ №1:

Вам нужно сделать это способом, аналогичным тому, как вы изменили username на _id . Вы можете создать служебную функцию:

 var usernameById = function(_id) {
  var user = Meteor.users.findOne(_id);
  return user amp;amp; user.username;
};
  

Редактировать:

Если вы не хотите опрашивать minimongo для каждого сообщения, просто включите его username вместо _id в свой объект message. Поскольку username они уникальны, их будет достаточно.

Если в вашем приложении вы разрешаете пользователям изменять username , было бы неплохо также сохранить _id для записи.

В одном из крупных приложений, с которыми я работал, мы сохранили пользователя _id в модели (для создания ссылок на профиль и т.д.), А также кэшировали его profile.name (для целей отображения).

Комментарии:

1. Возвращаемое значение должно быть user.username здесь, а не amp;amp; username .

2. Я мог бы это сделать, но для этого потребовалось бы перебирать все документы mongodb, и это повлияет на производительность (например, при большом количестве сообщений)

3. @Stennie на самом деле, я думаю, что если user это правдиво, то оно вернет значение user.username , а не логическое значение, как я предполагаю, вы ожидаете.

4. У меня была ошибка в коде раньше. Спасибо, @Stennie, что заметил.

5. Если вы хотите избежать просмотра коллекции пользователей каждый раз, просто сохраните username в сообщении вместо (или вместе с) _id.

Ответ №2:

Я предлагаю добавить пакет collection helpers от atmosphere. Затем создайте помощник для PMS под названием toUser, который возвращает соответствующего пользователя. Затем вы можете получить имя, используя message.user.name .