希望这个问题不会太长,但我想尽可能多地详细说明我所做的事情。
我试图找出如何在Meteor.publish()
中实现逻辑,该逻辑从数据库获取数据,更改列中的所有值,并使更新的集合可用于客户端订阅。
具体来说,我有一个表在用户之间存储消息,接收者由他的userId标识。我想用他在Meteor.users
表中可用的实际电话号码替换userId。
当我在网上查看时,我看到了使用transform
的建议,但我的理解是它没有被动反应..我接着了解了map
但发现它返回一个数组打破Meteor.publish()
方法。最后,我找到了使用forEach
和self.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
,尽管我希望日志中显示的消息可用
我觉得这是一个基本的用例,但我无法做到这一点..任何帮助表示赞赏!
答案 0 :(得分:0)
"您可以在服务器端转换集合,如下所示:"
https://stackoverflow.com/a/18344597/4023641
它对我有用。
不幸的是,用户集合中的更改不会反应性地更新这些自定义字段。