获取一个集合并为响应添加一个值
问题描述:
我想在服务器脚本中创建一个函数,该函数可以返回一个集合加上一些额外的值。 例如:获取一个集合并为响应添加一个值
Meteor.publish("users", function() {
var users;
users = Meteor.users.find();
users.forEach(function (user){
user.profile.image = "some-url";
});
return users;
});
但是这不起作用。 我的问题是:在发布函数中向集合响应中添加值的正确方法是什么?
答
这对服务器来说很重要吗?您可以使用客户端上的转换函数:
客户端JS现在
//Somewhere where it can run before anything else (make sure you have access to the other bits of the document i.e services.facebook.id otherwise you'll get a services is undefined
Meteor.users._transform = function(doc) {
doc.profile.image = "http://graph.facebook.com/" + doc.services.facebook.id + "/picture";
return doc;
}
当你这样做:
Meteor.user().profile.image
=> "http://graph.facebook.com/55592/picture"
我已经打开前一个问题,有关于共享转换到客户端:https://github.com/meteor/meteor/issues/821
答
有两种方法可以实现发布功能:
- 通过返回一个光标(或光标的阵列)
- 通过使用this.added(),this.changed()和this.removed()。
只有方法2允许修改返回的文档。
请参阅流星文档here。然而,由于提供的示例代码可能是复杂的,这里是另一个问题:
// server: publish the rooms collection
Meteor.publish("rooms", function() {
return Rooms.find({});
});
等同于:
// server: publish the rooms collection
Meteor.publish("rooms", function() {
var self = this;
var handle = Rooms.find({}).observeChanges({
added: function(id, fields) { self.added("rooms", id, fields); },
changed: function(id, fields) { self.changed("rooms", id, fields); },
removed: function(id) { self.added("rooms", id); },
}
});
self.ready();
self.onStop(function() { handle.stop(); });
});
在第二个示例中,您可以在发送前修改“字段”参数如下所示:
added: function(id, fields) {
fields.newField = 12;
self.added("rooms", id, fields);
},
来源:this post。
谢谢@Akshat!在哪里可以找到更多关于'_transform'方法的信息? – rec 2013-03-23 23:13:08
看看http://docs.meteor.com/#collections,这是一个稍微向下的例子。我上面使用的_transform没有记录,但它允许与文档中的用户集合相同的使用 – Akshat 2013-03-24 07:07:53
对不起,但我无法做到这一点,我看不到'Meteor.user() .profile' – rec 2013-03-25 06:07:22