Das Problem reproduzieren
Beim Versuch, Fehlermeldungen mithilfe von Web-Sockets weiterzugeben, tritt ein Problem auf. Ich kann das Problem, mit dem ich konfrontiert bin JSON.stringify
, wiederholen, um ein breiteres Publikum anzusprechen:
// 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);
'{}'
Das Problem ist, dass ich am Ende ein leeres Objekt habe.
Was ich versucht habe
Browser
Ich habe zuerst versucht, node.js zu verlassen und es in verschiedenen Browsern auszuführen. Die Chrome-Version 28 liefert das gleiche Ergebnis, und interessanterweise unternimmt Firefox zumindest einen Versuch, lässt jedoch die folgende Meldung aus:
>>> JSON.stringify(error); // Firebug, Firefox 23
{"fileName":"debug eval code","lineNumber":1,"stack":"@debug eval code:1\n"}
Ersatzfunktion
Ich habe mir dann den Error.prototype angesehen . Es zeigt, dass der Prototyp Methoden wie toString und toSource enthält . Da ich wusste, dass Funktionen nicht stringifiziert werden können, habe ich beim Aufrufen von JSON.stringify eine Ersetzungsfunktion eingefügt, um alle Funktionen zu entfernen, aber dann festgestellt, dass auch diese ein seltsames Verhalten aufweist:
var error = new Error('simple error message');
JSON.stringify(error, function(key, value) {
console.log(key === ''); // true (?)
console.log(value === error); // true (?)
});
Es scheint das Objekt nicht wie gewohnt zu durchlaufen, und daher kann ich nicht überprüfen, ob die Taste eine Funktion ist, und sie ignorieren.
Die Frage
Gibt es eine Möglichkeit, native Fehlermeldungen mit zu kennzeichnen JSON.stringify
? Wenn nicht, warum tritt dieses Verhalten auf?
Methoden, um dies zu umgehen
- Halten Sie sich an einfache stringbasierte Fehlermeldungen oder erstellen Sie persönliche Fehlerobjekte und verlassen Sie sich nicht auf das native Fehlerobjekt.
- Pull-Eigenschaften:
JSON.stringify({ message: error.message, stack: error.stack })
Aktualisierung
@ Ray Toal In einem Kommentar vorgeschlagen, dass ich mir die Eigenschaftsbeschreibungen anschaue . Es ist jetzt klar, warum es nicht funktioniert:
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);
}
Ausgabe:
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 }
Schlüssel : enumerable: false
.
Die akzeptierte Antwort bietet eine Problemumgehung für dieses Problem.