2014-01-17 8 views
7

Erhalte diesen Fehler in der Konsole, wenn ich versuche, auf eine Sammlung hochzuladen:Meteor Zulassen Upsert?

"Update fehlgeschlagen: Zugriff verweigert. Upsert in einer eingeschränkten Sammlung nicht zulässig."

Hier sind die Regeln erlauben I angegeben haben:

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

    }); 

} 

Hier ist der Upsert Teil:

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

Antwort

8

Dies wird a choice the development team gemacht hat.

Die vorgeschlagene Lösung besteht darin, eine Methode zu schreiben, die upsert umschließt. Dies führt dazu, dass die Serveranforderung vom Servercode kommt, während der Clientcode nur für die Latenzkompensation ausgeführt wird. Beispiel:

//shared code 
Meteor.methods({ 
    customersUpsert: function(id, doc){ 
    Customers.upsert(id, doc); 
    } 
}); 

//called from client 
Meteor.call('customersUpsert', Customers.maybeFindOne(attr)._id, attr); 
+0

Danke! Das hat den Trick gemacht. Es war mir auch gelungen, die Einfügung und Aktualisierungen aufzuteilen und $ set zu verwenden. – user3203772

1

Dies ist die Work-around verwende ich (Strich Standardwerte-Funktion):

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

die davon ausgeht, dass selector ist eine Objekt-ID.