Chrome开发者 - 无法分配给只读属性

时间:2014-10-09 21:07:40

标签: javascript angularjs mongodb google-chrome-devtools typeerror

我正在使用AngularJS,MongoDB和NodeJS构建应用程序。我的应用程序使用Mongolab REST API进行CRUD操作。我也在使用谷歌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根本没有显示任何错误,并且更新成功。 在我的角度模块中使用严格模式,更新本身使用以下方法完成:

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以作为URL的一部分发送,而不是作为通过PUT发送的数据的一部分。

另一种方法:

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

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

2 个答案:

答案 0 :(得分:5)

我明白了。 TypeError引用了angular.js第409行,它是关于扩展一个对象的。 我做错了什么:

angular.extend(params,  objCopy)

那么,我改变了什么($ update方法):

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

for:

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

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

我没有直接将我的objCopy复制到params,而是将一个空对象作为目标。对象参数将为空或正确扩展。

答案 1 :(得分:1)

不知道为什么它在一个浏览器而不是另一个浏览器中工作,但你不应该这样做:{_id:undefined}我能想到的任何原因。