【问题标题】:Meteor: Publishing users from field on own accountMeteor:在自己的帐户上从现场发布用户
【发布时间】:2014-01-25 10:51:07
【问题描述】:

我正在尝试从用户收藏中发布“朋友”。每个帐户都有一个字段保存所有朋友 ID(称为地址簿)。但是发布不起作用我只是获得自己的帐户(作为非管理员),例如如果我在控制台上调用 Meteor.users.find().fetch()。如果我按照控制台上方的方式执行此操作,则会记录以下内容:

I20140107-17:22:38.492(1)? ---------------------------------------[对象对象]
I20140107-17:22:38.497(1)? [ { _id: 'X6XXyD64AW4CvXG6m',
I20140107-17:22:38.498(1)?创建时间:2014 年 1 月 7 日星期二 17:10:43 > GMT+0100 (CET)
I20140107-17:22:38.498(1)?电子邮件:[[对象]],
I20140107-17:22:38.498(1)?服务:{密码:[对象],简历: [对象] },
I20140107-17:22:38.499(1)?用户名:“测试”}]

所以没有显示地址簿

这是我的代码的 sn-p:

服务器:

Meteor.publish("users", function(){
    if (Roles.userIsInRole(this.userId, ["admin"]))
        return Meteor.users.find();
    else
        return Meteor.users.find({_id : this.userId}, {fields: {username: 1, id_:1, emails:1, addressbook:1, createdAt:1}});
});

Meteor.publish("friends", function(){
    var addressbook = Meteor.users.find({_id: this.userId}, {limit:1} , {fields: {addressbook:1}});
    console.log("---------------------------------------" + addressbook);
    console.log(addressbook.fetch());

    //return Meteor.users.find({_id :{ $in : addressbook}}, {fields : {username:1, emails: 1}});

客户:

Deps.autorun(function() {
    Meteor.subscribe("friends");
    Meteor.subscribe("users");
});

如何将通过 ID 存储的用户发布到字段地址簿(或至少是他们的电子邮件和用户名)?有没有更好的方法来合并发布?

提前致谢!

【问题讨论】:

    标签: javascript mongodb meteor


    【解决方案1】:

    您的 friends 发布功能有一些问题:

    1. 在获取单个文档时,您实际上并不需要 limit - 只需使用 findOne
    2. options 对于 find 是单个对象。所以你想要:{limit: 1, fields: {addressbook: 1}}
    3. 必须先获取文档(或者您必须使用 findOne)才能访问其值。
    4. fetch 是一个在游标上可用的函数(find 的结果)。 addressbook 只是一个数组。

    您似乎走在了正确的轨道上。试试这个:

    Meteor.publish('friends', function() {
      var addressbook = Meteor.users.findOne(this.userId).addressbook || [];
      return Meteor.users.find({_id: {$in: addressbook}}, {fields: {username: 1, emails: 1}});
    });
    

    但是,值得一提的是,如果 addressbook 发生变化,friends 将不会反应。为此,您需要一个反应式连接。请参阅this问题。

    【讨论】:

    • 感谢您的建议。我已经尝试过这种方式,但它会在服务器端引发异常(复制您的代码),请在此处查看完整日志:pastebin.com/0EB4bMZF 我使用了 console.log(addressbook);它表明地址簿始终未定义:/
    • 如果没有定义addressbook,你会得到一个错误。我修改了代码来处理这种情况。如果 fetch 没有返回带有 addressbook 的文档,那么要么用户没有登录,要么用户文档没有 addressbook。检查this.userId 是否有效并使用meteor mongo 在控制台上打开数据库连接。当数据库连接打开时,运行db.users.findOne(userId) 其中userId 是你从上面得到的那个。查看文档是否有addressbook。如果没有,那么它没有被设置,这超出了这个问题的范围。
    • 谢谢!现在一切顺利!地址簿中有一个旧的 id 条目(不再存在),所以这就是异常的原因。
    猜你喜欢
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    相关资源
    最近更新 更多