Obtener una colección y agregar un valor a la respuesta

Quiero crear en el script del servidor una función que pueda devolver una colección más algún valor extra. Por ejemplo:

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

Pero esto no funciona bien. Mi pregunta es : ¿Cuál es la forma correcta de agregar un valor a una respuesta de colección en una función de publicación?

¿Es importante hacer esto con el servidor? Podrías usar la función de transformación en el cliente:

Cliente js

 //Somewhere where it can run before anything else (make sure you have access to the other bits of the document ie 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; } 

Ahora cuando lo hagas:

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

He abierto un problema antes con respecto a compartir una transformación en el cliente: https://github.com/meteor/meteor/issues/821

Hay 2 formas de implementar una función de publicación:

  1. Devolviendo un cursor (o una matriz de cursores)
  2. Al usar this.added (), this.changed () y this.removed ().

Sólo el método 2 permite modificar los documentos devueltos.

Por favor refiérase a la documentación de Meteor aquí . Sin embargo, dado que el código de muestra proporcionado puede parecer complejo, aquí hay otro:

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

es equivalente a:

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

En la segunda muestra, puede modificar el parámetro ‘campo’ antes de enviarlo para su publicación, de esta manera:

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

Fuente: este post .