update run how examples delete collection collections meteor upsert

collections - run - meteor update command



Meteor Permitir Upsert? (2)

Obteniendo este error en la consola cuando intento insertar una colección:

"Error de actualización: Acceso denegado. No se permiten los avisos en una colección restringida".

Estas son las reglas de permiso que he especificado:

if (Meteor.isClient) { Meteor.subscribe(''customers''); } customers = Customers if (Meteor.isServer) { Meteor.publish(''customers'', function() { return customers.find(); }); customers.allow({ insert: function (document) { return true; }, update: function () { return true; }, remove: function () { return true; } }); }

Aquí está la parte upsert:

Customer.prototype.create = function ( name, address, phone, cell, email, website, contact, shipping ) { var attr = { name : name, address : address, phone : phone, cell : cell, email : email, website : website, contact : contact, shipping : shipping }; Customers.upsert( Customers.maybeFindOne( attr )._id, attr ); return new Customer( attr ); };


Esta es una elección que el equipo de desarrollo ha realizado.

La solución sugerida es escribir un método que envuelva. Esto hace que la solicitud del servidor provenga del código del servidor, mientras que el código del cliente solo se ejecuta para la compensación de latencia. Ejemplo:

//shared code Meteor.methods({ customersUpsert: function( id, doc ){ Customers.upsert( id, doc ); } }); //called from client Meteor.call( ''customersUpsert'', Customers.maybeFindOne( attr )._id, attr );


Esta es la solución alternativa que uso (usando la función predeterminada de subrayado):

_upsert: function(selector, document) { if (this.collection.findOne(selector) != null) { this.collection.update(selector, { $set: document }); } else { this.collection.insert(_.defaults({ _id: selector }, document)); } }

Lo cual supone que el selector es una ID de objeto.