2016-02-28 33 views
1

我有一个Questions集合,我使用SimpleSchema在文件“collections.js”中定义了这个集合,它位于questions> lib中。如何在集合帮助器中获取未登录用户的用户名?

此集合有一个askedBy字段。它是一个存储提问问题的人员的用户标识的字符串数组。

askedBy: { 
    type: [String], 
    optional: true 
}, 

在另一个文件中,问题>服务器> publish.js,我有:

Meteor.publish("questions", function() { 
    questionList = Questions.find(
    {}, 
    { 
     fields: { 
     "_id": 1, 
     "questiontext": 1, 
     "createdAt": 1, 
     "askedBy": 1, 
     "slug": 1 
     } 
    } 
); 
    return questionList; 
}); 

我的目标是让谁问可问题的用户的姓名,即用户名与'askBy'数组中的ID相对应的用户。

我该怎么做?

事情我至今尝试过:

在collections.js:

Questions.helpers({ 
    askedByUsers: function() { 
    console.log("askedBy:"); 
    console.log(Meteor.users.findOne(this.askedBy[0])); 
    return Meteor.users.findOne(this.askedBy[0]); 
    }, 

失败的原因Meteor.users似乎只能访问用户的详细信息,当前登录。对于其他用户提出的所有问题,它将返回一个空值。

于是我尝试添加这publish.js:

Meteor.publish("allUsers", function() { 
    return Meteor.users.find({}, 
    { 
    "name": 1, 
    }); 
}); 

Meteor.subscribe("allUsers");既collections.js以及questions.js(其中有我所有的模板助手和事件处理程序)。我也将收集帮手改为:

Questions.helpers({ 
    askedByUsers: function() { 
    console.log("askedBy:"); 
    console.log(allUsers.findOne(this.askedBy[0])); 
    return allUsers.findOne(this.askedBy[0]); 
    }, 

但即使这样也行不通。

我做错了什么,以及如何获取未登录用户的用户名?

编辑:万一这是很重要的 - 文件夹结构

├── client 
├── modules 
│   ├── admin 
└── questions 
    ├── client 
    │   ├── questions.html 
    │   └── questions.js 
    ├── lib 
    │   ├── collections.js 
    │   └── methods.js 
    └── server 
     └── publish.js 
... 

回答

3

回答这个问题,有很多层,它的。基本上,您需要为查看问题发布的用户。

一种方法是订阅所有的用户。这不会扩展,但它应该给你一个结果。让我们修复上面的代码来完成这项工作。

当您发布allUsers时,它将在客户端上发布Meteor.users的用户文档 - 而不是称为allUsers的集合。另外,我假设askedByUsers应该返回一个数组或用户的光标,而不仅仅是一个用户。你可以重写你的助手这样的:

Questions.helpers({ 
    askedByUsers: function() { 
    return Meteor.users.find({ _id: { $in: this.askedBy } }); 
    }, 
}); 

然后在模板中,你可以这样做:

<template name='question'> 
    <ul> 
    {{#each askedByUsers}} 
    <li>{{name}}</li> 
    {{/each}} 
    </ul> 
</template> 

这是很好的,你应用了filterallUsers出版商。我会假设用户实际上有一个name字段,而不是profile.name或别的东西。请根据需要更正您的代码。

一旦你得到这个工作,看看我的回答this question探索如何发布加入(反应或其他),所以你可以避免发布所有的用户到客户端。

+0

我试过这个,但它让我回到了原来只能访问登录用户的问题,而不是数组中的其他用户标识。是我在lib文件夹> collections.js中定义这个集合助手的问题吗? publish.js位于服务器文件夹中,collections.js似乎不知道已发布的“allUsers”?我如何在collections.js中订阅已发布的allUsers? – Samudra

+2

确保'Meteor.subscribe'调用位于'client'目录下。或者,你可以用'Meteor.publish(null,function(){')替换'Meteor.publish(“allUsers”,function(){',这将自动订阅所有用户而不需要调用' Meteor.subscribe'。 –

+0

解决了它!(我不知道我什么时候发表评论 - 这是我的愚蠢:)) 我不知道我清楚地知道我以前做错了什么 - 你能帮忙吗?我的理解不正确?现在,我创建了一个新的出版物'allUsers',然后在客户端上订阅它,这会将更大版本的Meteor.users公开给我的整个应用程序吗?然后,当我打电话给Meteor.users.find在我的askByUsers助手中,它可以访问这整个扩展集?我确信这会在后来当我有真正的用户时产生问题 - 这是做这件事的最好方法吗? – Samudra

相关问题