我正在尝试在发布中发布自定义计算字段isFriend
,该字段从Meteor.user
返回记录。
我尝试了各种解决方案,但没有一个能够发挥作用:
从发布转换不符合此处所述...... https://stackoverflow.com/a/18344597/644081
我在这里尝试了解决方案How can I add temp. fields to a Meteor publish ..买不起作用...请参阅下面的代码
代码:
Meteor.publish("viewProfile", function(id) {
console.log("Finding the user: " + id);
var self = this;
Meteor.users
.find({"_id": id})
.forEach(function(entry) {
entry.isFriend = true; // this function changes the content of entry
self.added("Meteor.users", entry._id, entry);
});
self.ready();
});
请告知。
答案 0 :(得分:5)
转换文档的最简单方法是向collection添加transform
选项。您可以使用meteor API直接执行此操作,也可以使用collection-helpers之类的包执行此操作(有关详细信息,请参阅文档)。
但是,有时您需要在文档发布之前对其进行转换,因为只有服务器具有必要的信息。一个很好的例子是签名的URL。在这种情况下,您可以使用observe
或observeChanges
来操作每个对象。
observeChanges
效率更高,但它只能对部分文档进行操作(例如,如果您想要转换已存在的单个字段)。在您的示例中,您需要查看整个文档才能添加字段,因此您需要observe
。试试以下内容:
Meteor.publish('viewProfile', function(userId) {
check(userId, String);
// modify this as needed
var transform = function(user) {
user.isFriend = true;
return user;
};
// only publish the fields you really need
var fields = {username: 1, emails: 1, profile: 1};
var self = this;
var handle = Meteor.users.find(userId, {fields: fields}).observe({
added: function (user) {
self.added('users', user._id, transform(user));
},
changed: function (user) {
self.changed('users', user._id, transform(user));
},
removed: function (user) {
self.removed('users', user._id);
}
});
this.ready();
this.onStop(function() {
handle.stop();
});
});