AngularJS、MongoDB、NodeJSを使用してアプリを構築しています。私のアプリは、CRUD操作にMongolab REST APIを使用しています。デバッグにはGoogle Chrome開発者ツールも使用しています。
今日まで、mongoでの更新操作はChromeとFirefox(時々使用します)の両方で正常に機能していましたが、Chromeが自動的に更新された後、更新は失敗し、私はこのエラーがあります:
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
このエラーはChromeでのみ発生しますが、Firefoxはエラーをまったく表示せず、更新は成功しています。私のangularモジュールでstrictモードを使用すると、更新自体はこれを使用して行われます:
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);
};
どこ :
var queryJson = { "$inc": {"count":1} , "$set" : {"messages": message} };
Chromeまたは他の何かの更新によるものかどうかはわかりません。
誰かがこのようなものに出くわしたことがありますか?どんな助けでも大歓迎です。
注:{_ id:undefined}は、オブジェクトから_idプロパティを削除する方法にすぎません。 MongoLabでは、更新するオブジェクトのIDを、PUT経由で送信されるデータの一部としてではなく、URLの一部として送信する必要があります。
それを行う別の方法:
var objCopy = angular.copy(this) ;
if (objCopy._id)
delete objCopy["_id"] ;
httpPromise = $http.put(url + "/" + this.$id(), angular.extend(params, objCopy), {params:defaultParams}) ;
私はそれを考え出した。 TypeErrorは、オブジェクトの拡張に関するangular.js行409を参照していました。私が間違っていたこと:
angular.extend(params, objCopy)
だから、私が変更したもの($ updateメソッド):
var params = angular.isObject(queryJson) ? JSON.stringify(queryJson) : {};
ために :
var params = angular.isObject(queryJson) ? angular.extend({}, queryJson) : {};
httpPromise = $http.put(url + "/" + this.$id(), angular.extend(params, objCopy), {params:defaultParams}) ;
ObjCopyをparamsに直接コピーする代わりに、空のオブジェクトをターゲットとして渡しました。オブジェクトパラメータは空になるか、正しく拡張されます。
なぜ一方のブラウザで機能し、もう一方のブラウザでは機能しないのかわかりませんが、これを行うべきではありません:{_id:undefined}
なんらかの理由で私は考えることができます。