Meteor:通过自己的帐户从现场发布用户

时间:2014-01-07 16:38:09

标签: javascript mongodb meteor

我正在尝试从用户Collection中发布“朋友”。每个帐户都有一个字段可以保存所有朋友ID(称为地址簿)。但是发布不起作用我只获得自己的帐户(作为非管理员),例如如果我在控制台上调用Meteor.users.find()。fetch()。如果我按照控制台上方的方式记录以下内容:

  

I20140107-17:22:38.492(1)?   --------------------------------------- [object Object]
  I20140107-17:22:38.497(1)? [{_id:'X6XXyD64AW4CvXG6m',
  I20140107-17:22:38.498(1)? createdAt:Tue Jan 07 2014 17:10:43> GMT + 0100(CET)
  I20140107-17:22:38.498(1)?电子邮件:[[对象]],
  I20140107-17:22:38.498(1)?服务:{密码:[对象],简历:   [对象]},
  I20140107-17:22:38.499(1)?用户名:'test'}]

所以没有提供地址簿

这是我的代码片段:

服务器:

 
Meteor.publish("users", function(){
    if (Roles.userIsInRole(this.userId, ["admin"]))
        return Meteor.users.find();
    else
        return Meteor.users.find({_id : this.userId}, {fields: {username: 1, id_:1, emails:1, addressbook:1, createdAt:1}});
});

Meteor.publish("friends", function(){
    var addressbook = Meteor.users.find({_id: this.userId}, {limit:1} , {fields: {addressbook:1}});
    console.log("---------------------------------------" + addressbook);
    console.log(addressbook.fetch());

    //return Meteor.users.find({_id :{ $in : addressbook}}, {fields : {username:1, emails: 1}});

客户端:  

Deps.autorun(function() {
    Meteor.subscribe("friends");
    Meteor.subscribe("users");
});

如何将通过其ID存储的用户发布到字段地址簿(或至少是他们的电子邮件和用户名)?有没有更好的方法来组合发布?

提前致谢!

1 个答案:

答案 0 :(得分:0)

您的friends发布功能存在一些问题:

  1. 获取单个文档时,您确实不需要limit - 只需使用findOne
  2. {li> options find是一个对象。所以你想要:{limit: 1, fields: {addressbook: 1}}
  3. 在访问文档之前,必须提取文档(或者必须使用findOne)。
  4. fetch是游标上可用的函数(find的结果)。 addressbook只是一个数组。
  5. 看起来你是在正确的轨道上。试一试:

    Meteor.publish('friends', function() {
      var addressbook = Meteor.users.findOne(this.userId).addressbook || [];
      return Meteor.users.find({_id: {$in: addressbook}}, {fields: {username: 1, emails: 1}});
    });
    

    但是,值得一提的是,如果friends发生变化,addressbook将不会被动。为此,您需要一个反应性连接。请参阅this问题。