我正在尝试在发布中发布自定义计算字段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();
});
请告知。
最简单的转换文档的方法是在transform
中添加collection选项。您可以直接使用流星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();
});
});
以防万一,对其他人有所帮助,我修改了David Weldon的答案以返回句柄,以便客户端可以测试订阅是否准备就绪。像这样的东西:
在publish.js中:
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({_id: userId}, {fields: fields})
const subsription = handle.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() {
subsription.stop();
});
return handle;
});
现在可以在客户端中执行:
const handle = Meteor.subscribe('viewProfile', userId);
const isLoading = !handle.ready();