注销时无法查看用户配置文件(Meteor& Iron Router)

时间:2013-12-22 22:30:04

标签: meteor iron-router

我为我正在开发的应用程序构建了一个用户个人资料页面,当用户登录时页面工作正常,但是当没有人登录时,模板是空的。我的目标是任何人(即使它未在应用程序中注册)都能够看到用户个人资料。

以下是代码:

公开:

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();
    }   
});

我不知道我的代码中缺少什么。

谢谢!

2 个答案:

答案 0 :(得分:3)

你几乎得到了它 - 你只需要修复发布功能。您导航到个人资料页面时仅发布必要用户的方法是正确的。

在发布功能中,this.userId指的是主叫用户的ID。由于未登录的客户端没有userId,因此您的发布功能将返回[]并且客户端将无法呈现配置文件页面。你的发布函数的其余部分是不必要的 - 它应该返回一个游标而不必处理找不到数据的所有可能性。我想你想要这样的东西:

Meteor.publish('userForProfilePage', function(userId) {
  check(userId, String);
  return Meteor.users.find(userId, {
    fields: {createdAt: 1, username: 1}
  });
});

请注意以下事项:

  • 我使用了一个明确的名称来清楚地识别我正在做的事情。我发现userForProfilePagesingleUser更清晰,但这是一个品味问题。请务必根据需要更改您的订阅。
  • 我在userId输入上使用了一个简单的check。这验证它是一个字符串而不是未定义。您可以根据需要添加更复杂的检查。
  • 只有在检查通过后,我们才会返回userId的光标。游标返回的文档只包含_idcreatedAtusername字段(这样做是出于安全考虑)。

答案 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
            };
        });
    }
});