我为我正在开发的应用程序构建了一个用户个人资料页面,当用户登录时页面工作正常,但是当没有人登录时,模板是空的。我的目标是任何人(即使它未在应用程序中注册)都能够看到用户个人资料。
以下是代码:
公开:
Meteor.publish('singleUser', function(userId) {
if (this.userId) {
var findById = Meteor.users.find(userId);
return findById.count() ? findById : 'undefined';
}
return [];
});
路由器:
this.route('user_profile', {
path: '/users/:_id',
waitOn: function() {
return Meteor.subscribe('singleUser', this.params._id);
},
data: function() {
return Meteor.users.findOne({_id: this.params._id});
}
});
个人资料模板:
<template name="user_profile">
<h4>Username</h4>
<p>{{username}}</p>
<h4>User since:</h4>
<p>{{createdAtFormatted}}</p>
</template>
个人资料助手:
Template.user_profile.helpers({
createdAtFormatted: function(){
return moment(this.createdAt).fromNow();
}
});
我不知道我的代码中缺少什么。
谢谢!
答案 0 :(得分:3)
你几乎得到了它 - 你只需要修复发布功能。您导航到个人资料页面时仅发布必要用户的方法是正确的。
在发布功能中,this.userId
指的是主叫用户的ID。由于未登录的客户端没有userId
,因此您的发布功能将返回[]
并且客户端将无法呈现配置文件页面。你的发布函数的其余部分是不必要的 - 它应该返回一个游标而不必处理找不到数据的所有可能性。我想你想要这样的东西:
Meteor.publish('userForProfilePage', function(userId) {
check(userId, String);
return Meteor.users.find(userId, {
fields: {createdAt: 1, username: 1}
});
});
请注意以下事项:
userForProfilePage
比singleUser
更清晰,但这是一个品味问题。请务必根据需要更改您的订阅。userId
输入上使用了一个简单的check。这验证它是一个字符串而不是未定义。您可以根据需要添加更复杂的检查。userId
的光标。游标返回的文档只包含_id
,createdAt
和username
字段(这样做是出于安全考虑)。答案 1 :(得分:1)
我不太确定,您是要显示所有用户的个人资料还是仅显示一个用户的个人资料,因为如果您已注销,系统将无法知道它当前正在与哪个用户通话。我假设这一点,因为你说你想“看到用户档案”。
试试这个:
Meteor.publish('allUsers', function() {
return Meteor.users.find();
});
您也可以使用Meteor.methods()
。
Meteor.methods({
allUsers: function () {
return Meteor.users.find();
}
});
不要忘记将模板包装到{{#each allUsers}}{{/each}}
块中。
编辑:关于安全问题,请在将值传递给客户端之前映射值。
Meteor.methods({
allUsers: function () {
return Meteor.users.find().fetch().map(function(user) {
return {
"name": user.username,
"createdAt": user.createdAt
};
});
}
});