สร้างปัญหาขึ้นอีกครั้ง
ฉันพบปัญหาเมื่อพยายามส่งข้อความแสดงข้อผิดพลาดโดยใช้ซ็อกเก็ตเว็บ ฉันสามารถทำซ้ำปัญหาที่ฉันเผชิญโดยใช้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);
'{}'
ปัญหาคือฉันท้ายด้วยวัตถุที่ว่างเปล่า
สิ่งที่ฉันได้ลอง
เบราว์เซอร์
ฉันก่อนพยายามออก node.js และเรียกใช้ในเบราว์เซอร์ต่างๆ Chrome รุ่น 28 ให้ผลลัพธ์แบบเดียวกันและน่าสนใจอย่างน้อย Firefox ก็พยายามทำ แต่ก็ทิ้งข้อความไว้:
>>> JSON.stringify(error); // Firebug, Firefox 23
{"fileName":"debug eval code","lineNumber":1,"stack":"@debug eval code:1\n"}
ฟังก์ชั่นทดแทน
จากนั้นผมก็มองไปที่Error.prototype มันแสดงให้เห็นว่าต้นแบบมีวิธีการเช่นtoStringและtoSource เมื่อรู้ว่าฟังก์ชั่นไม่สามารถทำให้เป็นสตริงได้ฉันได้รวมฟังก์ชั่น replacer ไว้เมื่อเรียก 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 กโตอัลแนะนำในความคิดเห็นที่ฉันจะดูที่การอธิบายคุณสมบัติ เป็นที่ชัดเจนแล้วว่าทำไมมันไม่ทำงาน:
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
.
คำตอบที่ยอมรับให้วิธีแก้ปัญหาสำหรับปัญหานี้