Tái tạo vấn đề
Tôi đang gặp vấn đề khi cố gắng truyền thông báo lỗi xung quanh bằng cách sử dụng ổ cắm web. Tôi có thể sao chép vấn đề tôi đang gặp phải JSON.stringify
để sử dụng cho đối tượng rộng hơn:
// 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);
'{}'
Vấn đề là tôi kết thúc với một đối tượng trống rỗng.
Những gì tôi đã thử
Trình duyệt
Trước tiên tôi đã thử rời node.js và chạy nó trong các trình duyệt khác nhau. Chrome phiên bản 28 cho tôi kết quả tương tự, và thật thú vị, Firefox ít nhất cũng cố gắng nhưng bỏ qua thông báo:
>>> JSON.stringify(error); // Firebug, Firefox 23
{"fileName":"debug eval code","lineNumber":1,"stack":"@debug eval code:1\n"}
Chức năng thay thế
Sau đó tôi nhìn vào Error.prototype . Nó cho thấy nguyên mẫu chứa các phương thức như toString và toSource . Biết rằng các hàm không thể được xâu chuỗi, tôi đã bao gồm một hàm thay thế khi gọi JSON.opesify để xóa tất cả các hàm, nhưng sau đó nhận ra rằng nó cũng có một số hành vi kỳ lạ:
var error = new Error('simple error message');
JSON.stringify(error, function(key, value) {
console.log(key === ''); // true (?)
console.log(value === error); // true (?)
});
Nó dường như không lặp lại đối tượng như bình thường, và do đó tôi không thể kiểm tra xem khóa có phải là hàm không và bỏ qua nó.
Câu hỏi
Có cách nào để xâu chuỗi các thông báo Lỗi gốc JSON.stringify
không? Nếu không, tại sao hành vi này xảy ra?
Phương pháp khắc phục điều này
- Gắn bó với các thông báo lỗi dựa trên chuỗi đơn giản hoặc tạo các đối tượng lỗi cá nhân và không dựa vào đối tượng Lỗi gốc.
- Kéo thuộc tính:
JSON.stringify({ message: error.message, stack: error.stack })
Cập nhật
@Ray Toal Đề xuất trong một nhận xét rằng tôi hãy xem các mô tả tài sản . Bây giờ rõ ràng tại sao nó không hoạt động:
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);
}
Đầu ra:
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 }
Phím : enumerable: false
.
Câu trả lời được chấp nhận cung cấp một cách giải quyết cho vấn đề này.