util: throw toJSON errors when formatting %j
Previously all errors resulting from JSON.stringify were treated as a proof for circularity of the object structure. That is not the case if the `toJSON` method of the object throws an error. Explicitly check for the exact error message when determining the object structure's cyclicity. PR-URL: https://github.com/nodejs/node/pull/11708 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
This commit is contained in:
parent
98e54b0bd4
commit
455e6f1dd8
@ -38,13 +38,17 @@ const inspectDefaultOptions = Object.seal({
|
|||||||
breakLength: 60
|
breakLength: 60
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const CIRCULAR_ERROR_MESSAGE = 'Converting circular structure to JSON';
|
||||||
|
|
||||||
var Debug;
|
var Debug;
|
||||||
|
|
||||||
function tryStringify(arg) {
|
function tryStringify(arg) {
|
||||||
try {
|
try {
|
||||||
return JSON.stringify(arg);
|
return JSON.stringify(arg);
|
||||||
} catch (_) {
|
} catch (err) {
|
||||||
return '[Circular]';
|
if (err.name === 'TypeError' && err.message === CIRCULAR_ERROR_MESSAGE)
|
||||||
|
return '[Circular]';
|
||||||
|
throw err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,6 +86,16 @@ assert.strictEqual(util.format('o: %j, a: %j'), 'o: %j, a: %j');
|
|||||||
assert.strictEqual(util.format('%j', o), '[Circular]');
|
assert.strictEqual(util.format('%j', o), '[Circular]');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const o = {
|
||||||
|
toJSON() {
|
||||||
|
throw new Error('Not a circular object but still not serializable');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
assert.throws(() => util.format('%j', o),
|
||||||
|
/^Error: Not a circular object but still not serializable$/);
|
||||||
|
}
|
||||||
|
|
||||||
// Errors
|
// Errors
|
||||||
const err = new Error('foo');
|
const err = new Error('foo');
|
||||||
assert.strictEqual(util.format(err), err.stack);
|
assert.strictEqual(util.format(err), err.stack);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user