6

Sto costruendo un'applicazione utilizzando AngularJS, MongoDB e NodeJS. La mia app utilizza l'API REST di Mongolab per le operazioni CRUD. Sto anche utilizzando gli Strumenti per sviluppatori di Google Chrome per il debug.Chrome dev - Impossibile assegnare alla proprietà di sola lettura

Fino ad oggi, le mie operazioni di aggiornamento su Mongo stavano lavorando bene su entrambi Chrome e Firefox (che uso di tanto in tanto), ma dopo Chrome aggiornato automaticamente, gli aggiornamenti fallire e io ho questo errore:

TypeError: Cannot assign to read only property '_id' of {"$inc":{"count":1},"$set":{"messages":[{"unread":false,"flagged":false}]}} 
at http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.9/angular.js:409:18 

ho questo errore solo su Chrome, Firefox non mostra alcun errore e l'aggiornamento ha esito positivo. Utilizzando la modalità rigorosa nel mio modulo angolare L'aggiornamento si è fatto usando questo:

Resource.prototype.$update = function (queryJson,successcb, errorcb) { 
    var params = angular.isObject(queryJson) ? JSON.stringify(queryJson) : {}, 
     httpPromise = $http.put(url + "/" + this.$id(), angular.extend(params, this, {_id:undefined}), {params:defaultParams}); 

    return thenFactoryMethod(httpPromise, successcb, errorcb); 
}; 

Dove:

var queryJson = { "$inc": {"count":1} , "$set" : {"messages": message} }; 

non sono sicuro se è perché dell'aggiornamento su Chrome o qualcos'altro.

Qualcuno si è imbattuto in qualcosa del genere? Qualsiasi aiuto sarà molto apprezzato.

Nota: {_id: undefined} è solo un modo per rimuovere la proprietà _id dall'oggetto. MongoLab richiede che l'ID di un oggetto da aggiornare sia inviato come parte dell'URL e non come parte dei dati inviati tramite PUT.

Un altro modo di farlo:

var objCopy = angular.copy(this) ; 
if (objCopy._id) 
    delete objCopy["_id"] ; 

httpPromise = $http.put(url + "/" + this.$id(), angular.extend(params, objCopy), {params:defaultParams}) ; 

risposta

5

L'ho capito. TypeError si riferisce alla riga 409 di angular.js che riguarda l'estensione di un oggetto. quello che stavo facendo male:

angular.extend(params, objCopy) 

Allora, che cosa ho cambiato (metodo di aggiornamento $):

var params = angular.isObject(queryJson) ? JSON.stringify(queryJson) : {}; 

per:

var params = angular.isObject(queryJson) ? angular.extend({}, queryJson) : {}; 

httpPromise = $http.put(url + "/" + this.$id(), angular.extend(params, objCopy), {params:defaultParams}) ; 

Invece di copiare direttamente il mio objcopy a params, Ho passato un oggetto vuoto come bersaglio. I parametri dell'oggetto saranno vuoti o estesi correttamente.

1

Nessuna idea perché si sta lavorando in un browser e non l'altro, ma non si dovrebbe fare questo: {_id:undefined} per qualsiasi motivo, mi viene in mente.

+0

Grazie! è solo un modo di rimuovere la proprietà _id (vedi modifica sul post in alto) –

+1

Ma non dovresti modificare la proprietà _id; a mongodb non piacerà. Stai meglio cancellando la chiave. – Paul

+0

Ok, eliminerò la chiave. –

Problemi correlati