6

मैं AngularJS, MongoDB और NodeJS का उपयोग करके एक ऐप बना रहा हूं। मेरा ऐप सीआरयूडी संचालन के लिए मंगोलब रीस्ट एपीआई का उपयोग करता है। मैं डीबगिंग के लिए Google क्रोम डेवलपर टूल्स का भी उपयोग कर रहा हूं।क्रोम देव - केवल संपत्ति पढ़ने के लिए असाइन नहीं कर सकता

आज तक, मोंगो पर मेरे अद्यतन संचालन Chrome और Firefox (कि मैं कभी कभी का उपयोग), लेकिन पर ठीक काम कर रहे थे के बाद क्रोम स्वचालित रूप से अपडेट, अद्यतन असफल और मैं इस त्रुटि है:

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 

मेरे पास है यह त्रुटि केवल क्रोम पर है, फ़ायरफ़ॉक्स बिल्कुल कोई त्रुटि नहीं दिखाता है और अपडेट सफल होता है। अद्यतन ही मेरी कोणीय मॉड्यूल में सख्त मोड का उपयोग इस का उपयोग किया जाता:

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

मुझे यकीन है कि अगर यह क्रोम पर अद्यतन या कुछ और की वजह से नहीं कर रहा हूँ।

क्या कोई इस तरह से कुछ आया है? किसी भी प्रकार की सहायता सराहनीय होगी।

नोट: {_id: अपरिभाषित} ऑब्जेक्ट से _id प्रॉपर्टी को हटाने का एक तरीका है। मोंगोलाब को यूआरएल के हिस्से के रूप में भेजने के लिए किसी ऑब्जेक्ट की आईडी की आवश्यकता होती है, न कि PUT के माध्यम से भेजे गए डेटा के हिस्से के रूप में।

यह ऐसा करने का एक और तरीका है:

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

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

उत्तर

5

मैंने इसे समझ लिया। TypeError angular.js लाइन 40 9 में प्रस्तुत किया गया है जो किसी ऑब्जेक्ट को विस्तारित करने के बारे में है। क्या मैं गलत कर रहा था:

angular.extend(params, objCopy) 

तो, मैं क्या बदल ($ अद्यतन विधि):

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 पैरामीटर को कॉपी करने की

, मैंने लक्ष्य के रूप में एक खाली वस्तु पारित की। ऑब्जेक्ट पैराम या तो खाली या सही ढंग से विस्तारित होंगे।

1

कोई विचार क्यों यह एक ब्राउज़र में काम कर रहा है और अन्य नहीं है, लेकिन आप यह नहीं करना चाहिए: किसी भी कारण से मैं के बारे में सोच सकते हैं के लिए {_id:undefined}

+0

धन्यवाद! यह _id संपत्ति को हटाने का एक तरीका है (ऊपर दिए गए पोस्ट पर संपादित देखें) –

+1

लेकिन आपको _id संपत्ति को संशोधित नहीं करना चाहिए; mongodb उस पसंद नहीं होगा। आप कुंजी को हटाने से बेहतर हैं। – Paul

+0

ठीक है, मैं इसके बजाय कुंजी हटा दूंगा। –

संबंधित मुद्दे