获取集合并为响应添加值

时间:2013-03-23 04:19:31

标签: node.js mongodb meteor

我想在Server脚本中创建一个可以返回集合和一些额外值的函数。 例如:

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

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

2 个答案:

答案 0 :(得分:3)

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

  1. 返回游标(或游标数组)
  2. 使用this.added(),this.changed()和this.removed()。
  3. 只有方法2允许修改返回的文档。

    请参阅Meteor文档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(); });
    });
    

    在第二个示例中,您可以在发送之前修改'field'参数,如下所示:

    added: function(id, fields) { 
        fields.newField = 12;
        self.added("rooms", id, fields); 
    },
    

    来源:this post

答案 1 :(得分: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