Meteor 使用嵌入的用户数据发布论坛回复
我试图发布论坛回复到一个特定的线程,但我希望这些回复文档包括关于发布它的用户的额外信息 我不想把这些额外的信息保存在回复上,而是发布一个改进的版本 我已经在客户端使用mycollection.find.map做了类似的事情,并使用map函数在每个返回的文档上嵌入额外信息,但是,Meteor publish似乎不能发布数组,只能发布光标,因此简单的map函数是不允许的 有没有办法做到这一点?可能是一个返回光标的映射函数 我没有使用Meteor.methods,所以我可以有反应性,因为有了它们,我可以返回一个数组,然后像正常情况一样使用它 下面是一个失败的代码示例,但sends给出了我需要的信息: Meteor.publishforumthread,函数线程{ return-forumreplays.find{thread:thread}.mapfunctionr{ //让我们填写关于每个回复所有者的附加数据 var owner=Meteor.users.findOne{{u id:r.owner}; 如果!所有者 return;//没有所有者没有回复。。 如果!owner.forumStats{ owner.forumStats={}; owner.forumStats.postCount=0; owner.forumStats.postLikes=0; owner.forumStats.title=新手; owner.forumStats.tag=新手; 更新{u id:owner.{u id},{$set:{forumStats:owner.forumStats}; } r、 ownerid=所有者。\u id; r、 ownerUsername=owner.username; r、 ownerPostCount=owner.forumStats.postCount; r、 ownerPostLikes=owner.forumStats.postLikes; r、 ownerTitle=owner.forumStats.title; r、 ownerTag=owner.forumStats.tag; 返回r; }; };Meteor 使用嵌入的用户数据发布论坛回复,meteor,publish,Meteor,Publish,我试图发布论坛回复到一个特定的线程,但我希望这些回复文档包括关于发布它的用户的额外信息 我不想把这些额外的信息保存在回复上,而是发布一个改进的版本 我已经在客户端使用mycollection.find.map做了类似的事情,并使用map函数在每个返回的文档上嵌入额外信息,但是,Meteor publish似乎不能发布数组,只能发布光标,因此简单的map函数是不允许的 有没有办法做到这一点?可能是一个返回光标的映射函数 我没有使用Meteor.methods,所以我可以有反应性,因为有了它们,我可
谢谢。最后做了这个发现,Christian Fritz也建议:
Meteor.publish("serverforumthread", function(thread){
check(thread, String);
var replies = forumReplies.find({thread: thread});
var users = {};
replies.map(function(r){
users[r.owner] = r.owner;
});
var userids = _.map(users, function(value, key){ return value; });
var projectedFields = {_id:1, username:1, forumStats: 1, services: 0};
var usrs = Meteor.users.find({_id:{$in: userids}}, projectedFields);
var anyUpdateToUsers = false;
usrs.map(function(owner){
var changed = false;
if(!owner.username){
owner.username = owner.emails[0].address.split("@")[0];
changed = true;
}
//owner.forumStats = undefined;
if(!owner.forumStats){
owner.forumStats = {};
owner.forumStats.postCount = 0;
owner.forumStats.postLikes = 0;
owner.forumStats.title = "the newbie";
owner.forumStats.tag = "newbie";
owner.forumStats.img = "http://placehold.it/122x122";
changed = true;
}
if(changed){
anyUpdateToUsers = true;
Meteor.users.update({_id: owner._id}, {$set:{ forumStats:owner.forumStats }});
}
});
if(anyUpdateToUsers) // refresh it
usrs = Meteor.users.find({_id:{$in: userids}}, projectedFields);
usrs.map(function(owner){
console.log(owner);
});
return [replies, usrs];
});
它与以下客户端配合得非常好:
Template.forumReplyOwner.helpers({
replyOwner: function(reply){
var owner = Meteor.users.findOne({_id: reply.owner});
console.log(reply, owner);
if(!owner || !owner.forumStats) return; // oh shait!
var r = {};
r.owner = owner._id;
r.ownerUsername = owner.username;
r.ownerPostCount = owner.forumStats.postCount;
r.ownerPostLikes = owner.forumStats.postLikes;
r.ownerTitle = owner.forumStats.title;
r.ownerTag = owner.forumStats.tag;
r.ownerImg = owner.forumStats.img;
return r;
},
ownerImgTab: function(){
return {src: this.ownerImg};
}
});
然而,我现在面临另一个问题。即使我限制了我从用户集合发布的字段,它仍然发送服务字段,包含不应该发送的登录数据,想法.< /p>查看@克里斯蒂安-弗里茨回答,也见“@ AKSAT”答案,您也可以考虑将FuunMe答复和相应的用户数据一起发布,正如David Weldon在这里指出的:。我发现这些复合出版物非常强大,但很干净。然后,您将在客户端组装扩展论坛回复。