如何在收集助手中获取未登录用户的用户名?
How to fetch usernames of not logged in users in collection helpers?
我有一个 Questions
集合,我在文件 "collections.js" 中使用 SimpleSchema 定义了它,它在问题 > lib.
中
此集合有一个 askedBy
字段。它是一个字符串数组,用于存储提问者的用户 ID。
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;
});
我的objective是让提问的用户名可用,即'askedBy'数组中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
似乎只能访问当前登录的用户详细信息。对于其他用户提出的所有问题,它 returns 一个空值。
然后我尝试将其添加到 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
...
这个问题的答案有很多层次。从根本上说,您会希望针对正在查看的问题发布用户。
一种方法是订阅所有用户。这不会缩放,但它应该给你一个结果。让我们修复上面的代码以使其正常工作。
当您发布 allUsers
时,它会将用户文档发布到客户端上的 Meteor.users
- 而不是发布到名为 allUsers
的集合。另外,我假设 askedByUsers
应该 return 一个用户数组或游标,而不仅仅是一个用户。您可以像这样重写您的助手:
Questions.helpers({
askedByUsers: function () {
return Meteor.users.find({ _id: { $in: this.askedBy } });
},
});
然后在模板中,您可以执行以下操作:
<template name='question'>
<ul>
{{#each askedByUsers}}
<li>{{name}}</li>
{{/each}}
</ul>
</template>
很高兴您向 allUsers
发布商应用了 filter
。我假设用户实际上有一个 name
字段,而不是 profile.name
或其他字段。请根据需要更正您的代码。
一旦你完成这项工作,请查看我对 this question 的回答,了解如何发布连接(反应式或其他方式),这样你就可以避免将所有用户发布到客户端。
我有一个 Questions
集合,我在文件 "collections.js" 中使用 SimpleSchema 定义了它,它在问题 > lib.
此集合有一个 askedBy
字段。它是一个字符串数组,用于存储提问者的用户 ID。
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;
});
我的objective是让提问的用户名可用,即'askedBy'数组中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
似乎只能访问当前登录的用户详细信息。对于其他用户提出的所有问题,它 returns 一个空值。
然后我尝试将其添加到 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
...
这个问题的答案有很多层次。从根本上说,您会希望针对正在查看的问题发布用户。
一种方法是订阅所有用户。这不会缩放,但它应该给你一个结果。让我们修复上面的代码以使其正常工作。
当您发布 allUsers
时,它会将用户文档发布到客户端上的 Meteor.users
- 而不是发布到名为 allUsers
的集合。另外,我假设 askedByUsers
应该 return 一个用户数组或游标,而不仅仅是一个用户。您可以像这样重写您的助手:
Questions.helpers({
askedByUsers: function () {
return Meteor.users.find({ _id: { $in: this.askedBy } });
},
});
然后在模板中,您可以执行以下操作:
<template name='question'>
<ul>
{{#each askedByUsers}}
<li>{{name}}</li>
{{/each}}
</ul>
</template>
很高兴您向 allUsers
发布商应用了 filter
。我假设用户实际上有一个 name
字段,而不是 profile.name
或其他字段。请根据需要更正您的代码。
一旦你完成这项工作,请查看我对 this question 的回答,了解如何发布连接(反应式或其他方式),这样你就可以避免将所有用户发布到客户端。