Meteor.users 仅订阅 return 当前用户

Meteor.users subscribe only return current user

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

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

如何只获取与用户名匹配的用户?

我想你想要的不是发布,而是一种访问特定用户名的方法。 Publish/Subscribe 非常适合经常变化的数据集 - 比如 Whosebug 上的帖子、facebook 提要、新闻文章等。

您正在寻找 first/last 特定用户的名称,这并没有真正改变。所以你真正想要的是创建一个服务器方法,该方法 returns 用户的 first/last 名称。您可以从客户端调用此方法来访问此数据。

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 回调函数访问结果。

findOne 找到并 returns 第一个与选择器匹配的文档。发布方法需要return一个游标,需要使用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' });