SORU
22 AĞUSTOS 2013, PERŞEMBE


Bir Hata JSON kullanarak stringify mümkün değil.stringify?

Sorunu yeniden oluşturma

Web soketleri kullanarak etrafında hata iletileri geçirmek için çalışırken bir sorunla karşılaştım. Karşı karşıyayım sorunu JSON.stringify daha geniş bir kitleye hitap etmek için kullanarak taklit edebilecek:

// 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 bende de boş bir nesne ile son buluyor.

Denedim

Tarayıcılar

Ben ilk node.js bırakarak ve çeşitli tarayıcılarda çalışıyor. Chrome 28 sürümü bana aynı sonucu verir, ve ilginçtir ki, Firefox en azından bir girişim yapar ama mesaj bırakmış:

>>> JSON.stringify(error); // Firebug, Firefox 23
{"fileName":"debug eval code","lineNumber":1,"stack":"@debug eval code:1\n"}

Yer değiştirici işlevi

Ben o zaman Error.prototype baktı. Prototip toString toSource gibi yöntemleri içeren gösterir. Fonksiyonları stringified olamaz bilerek, JSON çağrılırken replacer function ben dahil.stringify tüm işlevleri kaldırmak için, ama sonra çok garip bir davranış olduğunu fark etti:

var error = new Error('simple error message');
JSON.stringify(error, function(key, value) {
    console.log(key === ''); // true (?)
    console.log(value === error); // true (?)
});

Normalde nesne üzerine döngü gibi görünmüyor, ve bu nedenle önemli bir işlevi olduğunu ve bunu görmezden eğer kontrol edemiyorum.

Soru

JSON.stringify ile yerel Hata iletileri stringify için herhangi bir yolu var mı? Neden bu davranış oluşmaz?

Bu etrafında almanın yöntemleri

  • String tabanlı basit hata mesajları ile sopa, ya da kişisel hata nesneleri oluşturmak ve yerel Hata nesnesi güvenmeyin.
  • Çekme özellikleri: JSON.stringify({ message: error.message, stack: error.stack })

Güncelleştirmeleri

@Ray Toal property descriptors bakmamın bir yorum ileri sürdü. Çalışmıyor artık açıktır:

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);
}

Çıkış:

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 cevap bu sorun için bir çözüm sağlar.

CEVAP
22 AĞUSTOS 2013, PERŞEMBE


Bir düz Object Error temsil almak için Error.prototype.toJSON tanımlayabilirsiniz:

Object.defineProperty(Error.prototype, 'toJSON', {
    value: function () {
        var alt = {};

        Object.getOwnPropertyNames(this).forEach(function (key) {
            alt[key] = this[key];
        }, this);

        return alt;
    },
    configurable: true
});
var error = new Error('testing');
error.detail = 'foo bar';

console.log(JSON.stringify(error));
// {"message":"testing","detail":"foo bar"}

Object.defineProperty() kullanarak olmadan toJSON enumerable bir özellik kendisi olarak ekler.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Justin Case

    Justin Case

    3 EKİM 2011
  • lifeisforsharingDT

    lifeisforsha

    18 Mayıs 2011
  • William Hyde

    William Hyde

    23 HAZİRAN 2008