Mereproduksi masalah
Saya mengalami masalah ketika mencoba menyampaikan pesan kesalahan menggunakan soket web. Saya dapat meniru masalah yang saya hadapi JSON.stringify
untuk memenuhi audiensi yang lebih luas:
// 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);
'{}'
Masalahnya adalah bahwa saya berakhir dengan objek kosong.
Apa yang saya coba
Browser
Saya pertama kali mencoba meninggalkan node.js dan menjalankannya di berbagai browser. Chrome versi 28 memberi saya hasil yang sama, dan cukup menarik, Firefox setidaknya membuat upaya tetapi tidak menerima pesan:
>>> JSON.stringify(error); // Firebug, Firefox 23
{"fileName":"debug eval code","lineNumber":1,"stack":"@debug eval code:1\n"}
Fungsi replacer
Saya kemudian melihat Error.prototype . Ini menunjukkan bahwa prototipe berisi metode seperti toString dan toSource . Mengetahui bahwa fungsi tidak dapat diubah, saya menyertakan fungsi replacer saat memanggil JSON.stringify untuk menghapus semua fungsi, tetapi kemudian menyadari bahwa itu juga memiliki beberapa perilaku aneh:
var error = new Error('simple error message');
JSON.stringify(error, function(key, value) {
console.log(key === ''); // true (?)
console.log(value === error); // true (?)
});
Tampaknya tidak untuk mengulang objek seperti biasanya, dan karena itu saya tidak dapat memeriksa apakah kuncinya adalah fungsi dan mengabaikannya.
Pertanyaan
Apakah ada cara untuk merangkai pesan kesalahan asli dengan JSON.stringify
? Jika tidak, mengapa perilaku ini terjadi?
Metode untuk mengatasi ini
- Tetap dengan pesan kesalahan sederhana berbasis string, atau buat objek kesalahan pribadi dan jangan mengandalkan objek kesalahan asli.
- Properti tarik:
JSON.stringify({ message: error.message, stack: error.stack })
Pembaruan
@ Ray Toal Diusulkan dalam komentar yang saya lihat di deskriptor properti . Jelas sekarang mengapa itu tidak berhasil:
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);
}
Keluaran:
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 }
Key: enumerable: false
.
Jawaban yang diterima memberikan solusi untuk masalah ini.