Sorunu yeniden oluşturma
Web soketlerini kullanarak hata mesajlarını iletmeye çalışırken bir sorunla karşılaşıyorum. Daha JSON.stringify
geniş bir kitleye hitap etmek için kullandığım sorunu çoğaltabilirim :
// 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);
'{}'
Sorun şu ki sonunda boş bir nesne ile karşılaşıyorum.
Ne denedim
Tarayıcılar
İlk olarak node.js'den ayrılmayı ve çeşitli tarayıcılarda çalıştırmayı denedim. Chrome 28 sürümü bana aynı sonucu veriyor ve ilginç bir şekilde Firefox en azından bir girişimde bulunuyor, ancak mesajı bıraktı:
>>> JSON.stringify(error); // Firebug, Firefox 23
{"fileName":"debug eval code","lineNumber":1,"stack":"@debug eval code:1\n"}
İkame işlevi
Sonra Error.prototype baktım . Prototipin toString ve toSource gibi yöntemler içerdiğini gösterir . İşlevlerin dizilemediğini bilerek, tüm işlevleri kaldırmak için JSON.stringify'ı çağırırken bir replacer işlevi ekledim, ancak daha sonra bazı garip davranışlar olduğunu fark ettim:
var error = new Error('simple error message');
JSON.stringify(error, function(key, value) {
console.log(key === ''); // true (?)
console.log(value === error); // true (?)
});
Nesnenin üzerinde normalde olduğu gibi dönmüyor gibi görünüyor ve bu nedenle anahtarın bir işlev olup olmadığını kontrol edip görmezden gelemiyorum.
Soru
Yerel Hata iletilerini dize etmenin bir yolu var mı JSON.stringify
? Değilse, bu davranış neden oluşur?
Bunu aşma yöntemleri
- Basit dize tabanlı hata mesajlarına sadık kalın veya kişisel hata nesneleri oluşturun ve yerel Hata nesnesine güvenmeyin.
- Çekme özellikleri:
JSON.stringify({ message: error.message, stack: error.stack })
Güncellemeler
@Ray Toal Bir yorumda özellik tanımlayıcılarına bir göz atmamı önerdi . Şimdi neden işe yaramadığı açık:
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);
}
Çıktı:
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 }
Anahtar: enumerable: false
.
Kabul edilen cevap, bu sorun için bir geçici çözüm sağlar.