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:
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 .