3

我想在服务器脚本中创建一个可以返回集合加上一些额外值的函数。例如:

Meteor.publish("users", function () {
    var users;
    users = Meteor.users.find();
    users.forEach(function (user){
        user.profile.image = "some-url";
    });
    return users;
});

但这不能正常工作。我的问题是:在发布函数中向集合响应添加值的正确方法是什么。

4

2 回答 2

3

有两种方法可以实现发布功能:

  1. 通过返回一个游标(或游标数组)
  2. 通过使用 this.added()、this.changed() 和 this.removed()。

只有方法 2 允许修改返回的文档。

请在此处参考 Meteor 文档。但是,由于提供的示例代码可能看起来很复杂,这里是另一个:

// 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); 
},

来源:这篇文章

于 2015-02-08T09:18:46.553 回答
2

这对服务器很重要吗?您可以在客户端上使用转换功能:

客户端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

于 2013-03-23T05:34:53.753 回答