如何在集合助手中获取未登录用户的用户名?

时间:2016-02-28 20:32:50

标签: mongodb meteor meteor-collection2 simple-schema

我有一个Questions集合,我已经在一个文件" collections.js"中使用SimpleSchema定义了这个问题>库。

此集合包含askedBy字段。它是一个字符串数组,用于存储提出问题的人的userIds。

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

我的目标是让提出问题的用户的姓名,即“问题”中的“用户”的用户名与用户名相对应。阵列。

我该怎么做?

到目前为止我尝试过的事情:

在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
...

1 个答案:

答案 0 :(得分: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>

filter应用于allUsers发布商是件好事。我将假设用户实际上有name字段,而不是profile.name或其他内容。请根据需要更正您的代码。

一旦你开始工作,请查看我对this question的回答,探讨如何发布联接(被动或其他),这样就可以避免将所有用户发布到客户端。