web-dev-qa-db-ja.com

Chrome dev-読み取り専用プロパティに割り当てることはできません

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}) ;
6
jfab fab

私はそれを考え出した。 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に直接コピーする代わりに、空のオブジェクトをターゲットとして渡しました。オブジェクトパラメータは空になるか、正しく拡張されます。

5
jfab fab

なぜ一方のブラウザで機能し、もう一方のブラウザでは機能しないのかわかりませんが、これを行うべきではありません:{_id:undefined}なんらかの理由で私は考えることができます。

1
Paul