注销时无法查看用户配置文件(Meteor&;Iron路由器)

注销时无法查看用户配置文件(Meteor&;Iron路由器),meteor,iron-router,Meteor,Iron Router,我已经为我正在开发的应用程序建立了一个用户配置文件页面,当用户登录时,该页面可以正常工作,但是当没有人登录时,模板是空的。我的目标是任何人(即使没有在应用程序中注册)都能看到用户配置文件 代码如下: 出版物: Meteor.publish('singleUser', function(userId) { if (this.userId) { var findById = Meteor.users.find(userId); return findById.

我已经为我正在开发的应用程序建立了一个用户配置文件页面,当用户登录时,该页面可以正常工作,但是当没有人登录时,模板是空的。我的目标是任何人(即使没有在应用程序中注册)都能看到用户配置文件

代码如下:

出版物:

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> 
我不知道我的代码中缺少了什么


谢谢

我不太确定您是要显示所有用户的配置文件还是只显示一个用户的配置文件,因为如果您注销,系统将不知道当前正在与哪个用户通话。我假设是这样,因为你说你想“查看用户配置文件”

试试这个:

Meteor.publish('allUsers', function() {
    return Meteor.users.find();
});
您还可以使用Meteor.methods()

不要忘了将模板包装到
{{{{each alluser}}{{/each}}
块中

编辑:关于安全问题,请在将值传递给客户端之前映射这些值

Meteor.methods({
    allUsers: function () {
        return Meteor.users.find().fetch().map(function(user) {
            return {
                "name": user.username,
                "createdAt": user.createdAt
            };
        });
    }
});

我不太确定您是要显示所有用户的配置文件还是只显示一个用户的配置文件,因为如果您注销,系统将不知道当前正在与哪个用户通话。我假设是这样,因为你说你想“查看用户配置文件”

试试这个:

Meteor.publish('allUsers', function() {
    return Meteor.users.find();
});
您还可以使用Meteor.methods()

不要忘了将模板包装到
{{{{each alluser}}{{/each}}
块中

编辑:关于安全问题,请在将值传递给客户端之前映射这些值

Meteor.methods({
    allUsers: function () {
        return Meteor.users.find().fetch().map(function(user) {
            return {
                "name": user.username,
                "createdAt": user.createdAt
            };
        });
    }
});

你几乎成功了-你只需要修复发布功能。当您导航到配置文件页面时,只发布必要用户的方法是正确的

在发布函数内部,
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
    输入中使用了一个简单的。这将验证它是否为字符串且未定义。您可以根据需要添加更复杂的检查
  • 只有当检查通过时,我们才会返回
    用户ID的游标。光标返回的文档将只包含
    \u id
    createdAt
    username
    字段(这样做是为了安全)

您几乎成功了-您只需修复发布功能。当您导航到配置文件页面时,只发布必要用户的方法是正确的

在发布函数内部,
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
    输入中使用了一个简单的。这将验证它是否为字符串且未定义。您可以根据需要添加更复杂的检查
  • 只有当检查通过时,我们才会返回
    用户ID的游标。光标返回的文档将只包含
    \u id
    createdAt
    username
    字段(这样做是为了安全)

为什么要为单个用户发布数据?是否要发布所有用户配置文件?为什么要检查此.userId?我认为您不希望用户必须登录。为什么要为单个用户发布数据?是否要发布所有用户配置文件?为什么要检查此.userId
?我想你不希望用户必须登录。嗯。。。这不会发布所有用户的电子邮件地址、简历令牌等吗?是的,这是一个潜在的安全风险。例如,如果只想获取名称,则必须在服务器端提取该信息。请参阅我添加的示例以获得澄清。我错过了这一点,因为它与问题没有直接关系,但谢谢你提到它!谢谢你的回答。我的目标是为每个用户创建一个配置文件页(/users/:\u id),我将测试您的建议。每个用户是否应该在其配置文件页上看到所有其他用户的姓名?如果不是这样的话,你就得稍微改变一下。不过,使用
Metheor.methods()
在这两种情况下都适用。我希望每个用户(以及任何访问应用程序但未注册的人)都可以使用{{username}}和{{createdAtFormatted}查看每个用户的页面。。。这不会发布所有用户的电子邮件地址、简历令牌等吗?是的,这是一个潜在的安全风险。例如,如果只想获取名称,则必须在服务器端提取该信息。请参阅我添加的示例以获得澄清。我错过了这一点,因为它与问题没有直接关系,但谢谢你提到它!谢谢你的回答。我的目标是为ea创建一个配置文件页面