rec
rec

Reputation: 302

Get a collection and add a value to the response

I want to create in the Server script a function that can return a collection plus some extra value. For example:

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

But this don't work proper. My question is: What is the right way to add a value to a collection reponse in a publish function.

Upvotes: 3

Views: 600

Answers (2)

steph643
steph643

Reputation: 2460

There are 2 ways you can implement a publish function:

  1. By returning a cursor (or an array of cursors)
  2. By using this.added(), this.changed() and this.removed().

Only method 2 allows to modify returned documents.

Please refer to Meteor documentation here. However, since the provided sample code might look complex, here is another one:

// server: publish the rooms collection
Meteor.publish("rooms", function () {
  return Rooms.find({});
});

is equivalent to:

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

In the second sample, you can modify the 'field' parameter before sending it for publication, like this:

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

Source: this post.

Upvotes: 3

Tarang
Tarang

Reputation: 75975

Is this important to do with the server? You could use the transform function on the client:

Client 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;
}

Now when you do:

Meteor.user().profile.image
=> "http://graph.facebook.com/55592/picture"

I have opened an issue before with regards to sharing a transform onto the client: https://github.com/meteor/meteor/issues/821

Upvotes: 2

Related Questions