在发送到客户端之前修改Meteor.publish中的数据

时间:2015-06-02 12:04:31

标签: meteor minimongo meteor-publications

我有以下用例:

  • 我在后端的MongoDB中有一个用户表,这是一个与前端不同的服务。我使用DDP.connect()连接到这个后端服务。
  • 每个用户都有一组"科目"
  • users表中的每个主题都由id引用,而不是名称。有一个单独的表叫做#34; subject"通过id保存主题。

  • 我想将用户发布到客户端,然而我希望首先使用主题填充已发布的用户。

我尝试了以下内容,受到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)行工作,但客户端中的更改并未显示出来。

1 个答案:

答案 0 :(得分:4)

我不确定您是如何修复代码的,但您可能不需要。看起来你想要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;
    }
  });
});