2015-06-02 2 views
3

У меня есть следующий случай использования:Изменить данные в Meteor.publish перед отправкой вниз к клиенту

  • У меня есть таблица пользователей в MongoDB на внутреннем интерфейсе, который является отдельной службой, чем внешний интерфейс. Я использую DDP.connect() для подключения к этой серверной службе.
  • У каждого пользователя есть набор «предметов»
  • В каждом объекте в таблице users указан идентификатор, а не имя. Существует отдельная таблица под названием «субъекты», в которой субъекты имеют идентификатор.

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

Я попытался следующие, вдохновленный this blog post:

// in the backend service on port 3030 
Meteor.publish('users', function(userId) { 
    var _this = this; 
    Meteor.users.find({ 
    _id: userId 
    }).forEach(function(user) { 
    user.profile = populate(user.profile); 
    console.log(user); 
    _this.changed('users', userId, { 
     _id: userId, 
     profile: user.profile 
    }); 
    }); 
    _this.ready(); 
}); 

// in the client 
var UserService = DDP.connect('http://localhost:3030'); 

var UserServiceProfile = UserService.subscribe('users', Meteor.userId()); 
console.log(UserServiceProfile); 

Это дает следующее сообщение об ошибке на внутреннем интерфейсе:
Exception from sub users id akuWx5TqsrArFnQBZ Error: Could not find element with id XhQu77F5ChjcMTSPr to change.

Поэтому я попытался изменить _this.changed на _this.added. Я не получаю никаких ошибок, но изменения не отображаются в минимальном клиенте клиента, хотя я вижу, что функция populate работает через линию console.log(user).

ответ

3

Я не уверен, как вы исправите свой код, но вам может и не понадобиться. Похоже, вы хотите пакет https://atmospherejs.com/maximum/server-transform.

Добавьте сервера преобразования пакета для вашего проекта, и заменить код с этим (я предполагаю, что вы также подчеркивание добавили в свой проект, а также сбор предметов в базе данных соответствует некоторым глобальная переменная под названием Объекты в вашем коде.):

Meteor.publishTransformed('users', function(userId) { 
    return Meteor.users.find({ 
    _id: userId 
    }).serverTransform({ 
    'profile.subjects': function(doc) { 
     var subjects = []; 
     _(doc.profile.subjects).each(function(subjectId) { 
     subjects.push(Subjects.findOne(subjectId)); 
     }); 

     return subjects; 
    } 
    }); 
}); 
Смежные вопросы