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.