你如何有条件地在Meteor中向客户发送数据?

Dio*_*nes 7 javascript meteor

我正试图弄清楚如何在流星中有条件地向客户端发送数据.我有两种用户类型,根据用户的类型,它们在客户端上的接口(因此它们所需的数据是不同的).

让我们说用户是类型counselorstudent.每个用户文档都有类似的role: 'counselor'role: 'student'.

学生们喜欢学生的具体信息sessionsRemaining,并counselor和辅导员都之类的东西pricePerSession,等等.

我如何确保Meteor.user()客户端上有我需要的信息,而且没有额外的信息?如果我登录作为一名学生,Meteor.user()应该包括sessionsRemainingcounselor,但如果我登录的辅导员.我认为我可能正在寻找的是有条件的出版物和流星术语中的订阅.

deb*_*lis 13

使用fields选项仅返回Mongo查询所需的字段.

Meteor.publish("extraUserData", function () {
  var user = Meteor.users.findOne(this.userId);
  var fields;

  if (user && user.role === 'counselor')
    fields = {pricePerSession: 1};
  else if (user && user.role === 'student')
    fields = {counselor: 1, sessionsRemaining: 1};

  // even though we want one object, use `find` to return a *cursor*
  return Meteor.users.find({_id: this.userId}, {fields: fields});
});
Run Code Online (Sandbox Code Playgroud)

然后在客户端上打电话

Meteor.subscribe('extraUserData');
Run Code Online (Sandbox Code Playgroud)

订阅可以在Meteor中重叠.因此,这种方法的优点在于,向客户端提供额外字段的发布功能与Meteor的幕后发布功能一起工作,该功能发送基本字段,如用户的电子邮件地址和配置文件.在客户端上,Meteor.users集合中的文档将是两组字段的并集.

  • 一个微妙的注意事项:如果用户的角色可以动态更改,则此发布者不会注意到并更改要发布的字段.如果你需要做类似的事情,你现在必须在`observe`之上手动实现它; 希望未来Meteor可以通过某种方式进行完全被动的发布. (2认同)