6

Buduję aplikację przy użyciu AngularJS, MongoDB i NodeJS. Moja aplikacja wykorzystuje interfejs API REST API Mongolab do operacji CRUD. Używam również Narzędzi dla programistów Google Chrome do debugowania.Chrome dev - Nie można przypisać do właściwości tylko do odczytu

Do dzisiaj moje operacje aktualizacji na Mongo pracowali w porządku zarówno Chrome i Firefox (który używam sporadycznie), ale po Chrome aktualizowane automatycznie, aktualizacje nie i mam ten błąd:

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 

mam ten błąd występuje tylko w przeglądarce Chrome, Firefox nie pokazuje żadnego błędu, a aktualizacja zakończyła się pomyślnie. Korzystanie z trybu ścisłego moim modułu kątowego samej aktualizacji odbywa się za pomocą tego:

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

Gdzie:

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

Nie jestem pewien, czy to z powodu aktualizacji Chrome lub coś innego.

Czy ktoś napotkał coś takiego? Każda pomoc zostanie bardzo doceniona.

Uwaga: {_id: undefined} jest po prostu sposobem na usunięcie właściwości _id z obiektu. MongoLab wymaga, aby identyfikator obiektu był aktualizowany i wysyłany jako część adresu URL, a nie jako część danych przesyłanych przez PUT.

Kolejny sposób to zrobić:

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

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

Odpowiedz

5

Wyjaśniałem to. TypeError odwołuje się do linii 409 angular.js, która dotyczy rozszerzenia obiektu. co robiłem źle:

angular.extend(params, objCopy) 

Więc co mam zmieniony (metody aktualizacji $):

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

dla:

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

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

zamiast kopiowania bezpośrednio mój objcopy do params, Podałem pusty obiekt jako cel. Parametry obiektów będą puste lub poprawnie przedłużone.

1

Nie mam pojęcia, dlaczego to działa w jednej przeglądarce, a nie inny, ale nie powinno się tego robić: {_id:undefined} jakiegokolwiek powodu mogę myśleć.

+0

Dziękujemy! to tylko sposób na usunięcie właściwości _id (patrz edytuj na powyższym wpisie). –

+1

Ale nie powinieneś modyfikować właściwości _id; mongodb tego nie polubi. Lepiej usuwaj klucz. – Paul

+0

OK, zamiast tego usunę klucz. –