我正在使用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}) ;
答案 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}
我能想到的任何原因。