समस्या का पुन: प्रस्तुत करना
जब मैं वेब सॉकेट का उपयोग करते हुए त्रुटि संदेशों को पास करने की कोशिश कर रहा हूं तो मैं एक समस्या में चल रहा हूं। मैं उस मुद्दे को दोहरा सकता हूं जिसका मैं JSON.stringify
व्यापक दर्शकों को पूरा करने के लिए उपयोग कर रहा हूं :
// node v0.10.15
> var error = new Error('simple error message');
undefined
> error
[Error: simple error message]
> Object.getOwnPropertyNames(error);
[ 'stack', 'arguments', 'type', 'message' ]
> JSON.stringify(error);
'{}'
समस्या यह है कि मैं एक खाली वस्तु के साथ समाप्त होता हूं।
मैंने क्या कोशिश की है
ब्राउज़र्स
मैंने पहली बार नोड.जेएस छोड़ने और इसे विभिन्न ब्राउज़रों में चलाने की कोशिश की। क्रोम संस्करण 28 मुझे एक ही परिणाम देता है, और दिलचस्प रूप से पर्याप्त है, फ़ायरफ़ॉक्स कम से कम एक प्रयास करता है लेकिन संदेश छोड़ दिया है:
>>> JSON.stringify(error); // Firebug, Firefox 23
{"fileName":"debug eval code","lineNumber":1,"stack":"@debug eval code:1\n"}
पुनरावृत्ति करने वाला कार्य
मैंने तब Error.prototype को देखा । यह दर्शाता है कि प्रोटोटाइप जैसे तरीकों में शामिल है toString और toSource । यह जानते हुए कि कार्यों को कठोर नहीं किया जा सकता है, मैंने JSON.stringify को सभी कार्यों को हटाने के लिए कॉल करते समय एक प्रतिकृति फ़ंक्शन को शामिल किया, लेकिन फिर एहसास हुआ कि यह भी कुछ अजीब व्यवहार था:
var error = new Error('simple error message');
JSON.stringify(error, function(key, value) {
console.log(key === ''); // true (?)
console.log(value === error); // true (?)
});
यह वस्तु पर लूप लगता नहीं है क्योंकि यह सामान्य रूप से होता है, और इसलिए मैं जांच नहीं कर सकता कि कुंजी एक फ़ंक्शन है और इसे अनदेखा करें।
प्रश्न
वहाँ मूल त्रुटि संदेश के साथ तार करने का कोई तरीका है JSON.stringify
? यदि नहीं, तो यह व्यवहार क्यों होता है?
इसके आस-पास होने के तरीके
- सरल स्ट्रिंग-आधारित त्रुटि संदेशों के साथ छड़ी करें, या व्यक्तिगत त्रुटि ऑब्जेक्ट बनाएं और मूल त्रुटि ऑब्जेक्ट पर भरोसा न करें।
- खींच गुण:
JSON.stringify({ message: error.message, stack: error.stack })
अपडेट
@Ray Toal ने टिप्पणी में सुझाव दिया है कि मैं संपत्ति के विवरणकर्ताओं पर एक नज़र डालता हूं । अब यह स्पष्ट है कि यह काम क्यों नहीं करता है:
var error = new Error('simple error message');
var propertyNames = Object.getOwnPropertyNames(error);
var descriptor;
for (var property, i = 0, len = propertyNames.length; i < len; ++i) {
property = propertyNames[i];
descriptor = Object.getOwnPropertyDescriptor(error, property);
console.log(property, descriptor);
}
आउटपुट:
stack { get: [Function],
set: [Function],
enumerable: false,
configurable: true }
arguments { value: undefined,
writable: true,
enumerable: false,
configurable: true }
type { value: undefined,
writable: true,
enumerable: false,
configurable: true }
message { value: 'simple error message',
writable: true,
enumerable: false,
configurable: true }
कुंजी: enumerable: false
।
स्वीकृत उत्तर इस समस्या के लिए समाधान प्रदान करता है।