我正在尝试通过用户名获取用户,当我使用Meteor.users.findOne
时,它总是返回当前用户。如果我使用Meteor.users.find
,则会返回所有当前用户文档以及正确匹配的用户名的profile.firstName
和profile.lastName
。
Meteor.publish('userByUsername', function(username) {
return Meteor.users.findOne({
username: username
}, {
fields: {
'profile.firstName': 1,
'profile.lastName': 1,
}
});
});
如何才能获得与用户名匹配的用户?
答案 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' });
。