转换Meteor.publish

时间:2015-05-13 23:29:04

标签: mongodb meteor publish-subscribe

希望这个问题不会太长,但我想尽可能多地详细说明我所做的事情。

我试图找出如何在Meteor.publish()中实现逻辑,该逻辑从数据库获取数据,更改列中的所有值,并使更新的集合可用于客户端订阅。
具体来说,我有一个表在用户之间存储消息,接收者由他的userId标识。我想用他在Meteor.users表中可用的实际电话号码替换userId。

当我在网上查看时,我看到了使用transform的建议,但我的理解是它没有被动反应..我接着了解了map但发现它返回一个数组打破Meteor.publish()方法。最后,我找到了使用forEachself.added()以及self.ready()的内容,因此我的代码目前看起来像这样:

Meteor.publish("myMessages", function () {
    var self = this;
    Messages.find({ 
        $or: [
            { senderId: this.userId },
            { recipientId: this.userId }
        ]
    }).forEach(function(m) {
        m.recipientId = Meteor.users.findOne({ _id: m.recipientId }).username;
        console.log("adding msg to collection:");
        console.log(m);
        self.added("Messages", m._id, m);
    });
    self.ready();
  });

日志消息看起来正确,当Meteor重新启动时,它会打印来自数据库的所有消息,这些消息与使用电话号码正确替换收件人的用户相关。但是,在客户端,当我尝试运行Messages.findOne(msgId)时(通过直接在mongo shell中选择我已验证的ID),我得到undefined,然后通过开发人员运行Messages.find()浏览器中的工具也会返回undefined,尽管我希望日志中显示的消息可用 我觉得这是一个基本的用例,但我无法做到这一点..任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

"您可以在服务器端转换集合,如下所示:"

https://stackoverflow.com/a/18344597/4023641

它对我有用。

不幸的是,用户集合中的更改不会反应性地更新这些自定义字段。