Meteor.users只订阅返回当前用户

时间:2015-07-23 23:24:44

标签: angularjs meteor angular-meteor

我正在尝试通过用户名获取用户,当我使用Meteor.users.findOne时,它总是返回当前用户。如果我使用Meteor.users.find,则会返回所有当前用户文档以及正确匹配的用户名的profile.firstNameprofile.lastName

Meteor.publish('userByUsername', function(username) {
    return Meteor.users.findOne({
        username: username
    }, {
        fields: {
            'profile.firstName': 1,
            'profile.lastName': 1,
        }
    });
});

如何才能获得与用户名匹配的用户?

2 个答案:

答案 0 :(得分:1)

我认为你想要的不是发布,而是访问特定用户名的方法。发布/订阅非常适合经常更改的数据集 - 比如stackoverflow,facebook feed,新闻文章等上的帖子。

您希望获得特定用户的名/姓,这并没有真正改变。所以你真正想要的是创建一个返回用户名/姓的服务器方法。您可以从客户端调用此方法来访问此数据。

if (Meteor.isClient) {

  //get username var
  Meteor.call('findUser', username, function(err, res) {
    console.log(res.profile.firstName + " " + res.profile.lastName);
  });

}

if (Meteor.isServer) {

  Meteor.methods({
    findUser: function(username) {
      return Meteor.users.findOne({
        username: username
      }, {
        fields: {
          'profile.firstName': 1,
          'profile.lastName': 1
        }
      });
    }
  });

}

请注意,客户端Meteor.call有一个回调方法。 Meteor服务器上的数据库查询是异步的&非阻塞,因此您需要通过javascript回调函数访问结果。

答案 1 :(得分:0)

findOne查找并返回与选择器匹配的第一个文档。发布方法需要返回游标,需要使用find,而不是findOne:

Meteor.publish('userByUsername', function(username) {
    return Meteor.users.find({
        username: username
    }, {
        fields: {
            'profile.firstName': 1,
            'profile.lastName': 1,
        }
    });
});

然后你可以在客户端上调用subscribe:

Meteor.subscribe('userByUsername', 'bob');

例如,在帮助程序中调用Meteor.users.findOne({ username: 'bob' });