4

我有以下用例:

  • 我在后端的 MongoDB 中有一个用户表,它是与前端不同的服务。我使用 DDP.connect() 连接到这个后端服务。
  • 每个用户都有一组“主题”
  • users 表中的每个主题都由 id 引用,而不是 name。有一个名为“subjects”的单独表,它按 id 保存主题。

  • 我想将用户发布到客户端,但是我希望发布的用户首先填充主题。

受这篇博文的启发,我尝试了以下方法:

// 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. 我没有收到任何错误,但是客户端 minimongo 中没有显示更改,即使我可以看到该populate功能通过该console.log(user)行工作。

4

1 回答 1

4

我不确定您将如何修复代码,但您可能不需要。看起来您想要https://atmospherejs.com/maximum/server-transform包。

server-transform包添加到您的项目中,并用它替换您的代码(我假设您的项目中也添加了下划线,并且数据库中的主题集合对应于代码中名为Subjects的全局变量。 ):

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;
    }
  });
});
于 2015-07-29T16:30:51.620 回答