process: cast promise rejection reason to string
The unhandled promise rejection warning uses a template literal and prints the reason a promise was rejected. If rejecting with a symbol, the symbol failed to convert to a string and the process crashed. Now, symbols are casted to strings and the process does not crash. Fixes: https://github.com/nodejs/node/issues/11637 PR-URL: https://github.com/nodejs/node/pull/11640 Reviewed-By: Anna Henningsen <anna@addaleax.net>
This commit is contained in:
parent
74f61e8e1f
commit
a3132b0aa5
@ -57,7 +57,7 @@ function setupPromises(scheduleMicrotasks) {
|
|||||||
|
|
||||||
function emitWarning(uid, reason) {
|
function emitWarning(uid, reason) {
|
||||||
const warning = new Error('Unhandled promise rejection ' +
|
const warning = new Error('Unhandled promise rejection ' +
|
||||||
`(rejection id: ${uid}): ${reason}`);
|
`(rejection id: ${uid}): ${String(reason)}`);
|
||||||
warning.name = 'UnhandledPromiseRejectionWarning';
|
warning.name = 'UnhandledPromiseRejectionWarning';
|
||||||
warning.id = uid;
|
warning.id = uid;
|
||||||
if (reason instanceof Error) {
|
if (reason instanceof Error) {
|
||||||
|
18
test/parallel/test-promises-unhandled-symbol-rejections.js
Normal file
18
test/parallel/test-promises-unhandled-symbol-rejections.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
'use strict';
|
||||||
|
const common = require('../common');
|
||||||
|
|
||||||
|
const expectedDeprecationWarning = 'Unhandled promise rejections are ' +
|
||||||
|
'deprecated. In the future, promise ' +
|
||||||
|
'rejections that are not handled will ' +
|
||||||
|
'terminate the Node.js process with a ' +
|
||||||
|
'non-zero exit code.';
|
||||||
|
const expectedPromiseWarning = 'Unhandled promise rejection (rejection id: ' +
|
||||||
|
'1): Symbol()';
|
||||||
|
|
||||||
|
common.expectWarning({
|
||||||
|
DeprecationWarning: expectedDeprecationWarning,
|
||||||
|
UnhandledPromiseRejectionWarning: expectedPromiseWarning,
|
||||||
|
});
|
||||||
|
|
||||||
|
// ensure this doesn't crash
|
||||||
|
Promise.reject(Symbol());
|
Loading…
x
Reference in New Issue
Block a user