在我的社交应用程序中(比如FB),我很奇怪需要在一次发布中合并同一个集合用户的两个游标!
Meteor server打印此错误: “发布函数为集合用户返回了多个游标”。
也许这不能在Meteor 0.7.2中完成,也许我错了方法。 但我已经看到游标的结构非常简单,因为我可以进行简单的数组合并并返回一个Cursor?
客户端
Meteor.subscribe('friendById', friend._id, function() {
//here show my friend data and his friends
});
服务器
//shared functions in lib(NOT EDITABLE)
getUsersByIds = function(usersIds) {
return Meteor.users.find({_id: {$in: usersIds} },
{
fields: { // limited fields(FRIEND OF FRIEND)
username: 1,
avatar_url: 1
}
});
};
getFriendById = function(userId) {
return Meteor.users.find(userId,
{
fields: { // full fields(ONLY FOR FRIENDS)
username: 1,
avatar_url: 1,
online: 1,
favorites: 1,
follow: 1,
friends: 1
}
});
};
Meteor.publish('friendById', function(userId) { //publish user data and his friends
if(this.userId && userId)
{
var userCur = getFriendById(userId),
userFriends = userCur.fetch()[0].friends,
retCurs = [];
//every return friend data
retCurs.push( userCur );
//if user has friends! returns them but with limited fields:
if(userFriends.length > 0)
retCurs.push( getUsersByIds(userFriends) );
//FIXME ERROR "Publish function returned multiple cursors for collection users"
return retCurs; //return one or more cursor
}
else
this.ready();
});
答案 0 :(得分:4)
请参阅bold red text in the documentation:
如果在数组中返回多个游标,则它们当前必须全部来自不同的集合。
有smart-publish个软件包,可以在发布时添加此功能,以管理同一集合上的多个游标。这是相对较新的。
使用' this.added',' this.removed'和' this.changed'手动管理游标。在发布内部。
答案 1 :(得分:1)
<强>解强>
Meteor.publish('friendById', function(userId) {
if(this.userId && userId)
{
var userCur = getFriendById(userId), //user full fields
userData = userCur.fetch()[0],
isFriend = userData.friends.indexOf(this.userId) != -1,
retCurs = [];
//user and his friends with limited fields
retCurs.push( getUsersByIds( _.union(userId, userData.friends) ));
if(isFriend)
{
console.log('IS FRIEND');
this.added('users',userId, userData); //MERGE full fields if friend
//..add more fields and collections in reCurs..
}
return retCurs;
}
else
this.ready();
});