0

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

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

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

4

2 回答 2

1

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

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

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

于 2015-07-24T01:56:22.007 回答
0

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

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

然后你可以在客户端调用订阅:

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

例如,请致电Meteor.users.findOne({ username: 'bob' });您的助手。

于 2015-07-24T09:19:26.450 回答