Skip to content

Commit 4f638f6

Browse files
committed
domain,events: support non-object 'error' argument
Fix a TypeError when emitting an 'error' argument with a non-object argument (like a string) when domains are active. Fixes: nodejs/help#501 PR-URL: #11438 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 3f02b47 commit 4f638f6

File tree

2 files changed

+33
-10
lines changed

2 files changed

+33
-10
lines changed

lib/events.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,11 @@ EventEmitter.prototype.emit = function emit(type) {
153153
if (domain) {
154154
if (!er)
155155
er = new Error('Uncaught, unspecified "error" event');
156-
er.domainEmitter = this;
157-
er.domain = domain;
158-
er.domainThrown = false;
156+
if (typeof er === 'object' && er !== null) {
157+
er.domainEmitter = this;
158+
er.domain = domain;
159+
er.domainThrown = false;
160+
}
159161
domain.emit('error', er);
160162
} else if (er instanceof Error) {
161163
throw er; // Unhandled 'error' event

test/parallel/test-event-emitter-no-error-provided-to-error-event.js

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,33 @@ const common = require('../common');
33
const assert = require('assert');
44
const events = require('events');
55
const domain = require('domain');
6-
const e = new events.EventEmitter();
76

8-
const d = domain.create();
9-
d.add(e);
10-
d.on('error', common.mustCall(function(er) {
11-
assert(er instanceof Error, 'error created');
12-
}));
7+
{
8+
const e = new events.EventEmitter();
9+
const d = domain.create();
10+
d.add(e);
11+
d.on('error', common.mustCall(function(er) {
12+
assert(er instanceof Error, 'error created');
13+
}));
14+
e.emit('error');
15+
}
1316

14-
e.emit('error');
17+
for (const arg of [false, null, undefined]) {
18+
const e = new events.EventEmitter();
19+
const d = domain.create();
20+
d.add(e);
21+
d.on('error', common.mustCall(function(er) {
22+
assert(er instanceof Error, 'error created');
23+
}));
24+
e.emit('error', arg);
25+
}
26+
27+
for (const arg of [42, 'fortytwo', true]) {
28+
const e = new events.EventEmitter();
29+
const d = domain.create();
30+
d.add(e);
31+
d.on('error', common.mustCall(function(er) {
32+
assert.strictEqual(er, arg);
33+
}));
34+
e.emit('error', arg);
35+
}

0 commit comments

Comments
 (0)