সমস্যা পুনরুত্পাদন
ওয়েব সকেট ব্যবহার করে চারপাশে ত্রুটি বার্তাগুলি পাস করার চেষ্টা করার সময় আমি একটি সমস্যার মধ্যে চলে আসছি। আমি 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);
'{}'
সমস্যাটি হ'ল আমি একটি খালি জিনিস দিয়ে শেষ করি।
আমি কি চেষ্টা করেছি
ব্রাউজার
আমি প্রথমে নোড.জেগুলি রেখে বিভিন্ন ব্রাউজারে এটি চালানোর চেষ্টা করেছি। ক্রোম সংস্করণ ২৮ আমাকে একই ফলাফল দেয় এবং আকর্ষণীয়ভাবে যথেষ্ট, ফায়ারফক্স অন্তত চেষ্টা করে তবে বার্তাটি বাদ দেয়:
>>> JSON.stringify(error); // Firebug, Firefox 23
{"fileName":"debug eval code","lineNumber":1,"stack":"@debug eval code:1\n"}
Replacer ফাংশন
আমি তখন ত্রুটি.প্রোটোটাইপটি তাকালাম । এটা দেখায় যে প্রোটোটাইপ যেমন পদ্ধতি রয়েছে 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 })
আপডেট
@ রায় তোয়াল একটি মন্তব্যে প্রস্তাবিত যে আমি সম্পত্তি বর্ণনাকারীদের দিকে নজর রাখি । এটি কেন কাজ করে না তা এখন স্পষ্ট:
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
।
স্বীকৃত উত্তর এই সমস্যার জন্য একত্রে কাজ করে।