#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 .