diff --git a/packages/pg/lib/query.js b/packages/pg/lib/query.js index 3b93cb5ba..402e27679 100644 --- a/packages/pg/lib/query.js +++ b/packages/pg/lib/query.js @@ -125,12 +125,10 @@ class Query extends EventEmitter { err = this._canceledDueToError this._canceledDueToError = false } - // if callback supplied do not emit error event as uncaught error - // events will bubble up to node process - if (this.callback) { - return this.callback(err) + if (this.listenerCount('error') > 0) { + this.emit('error', err) } - this.emit('error', err) + if (this.callback) return this.callback(err) } handleReadyForQuery(con) { diff --git a/packages/pg/test/unit/client/query-timeout-tests.js b/packages/pg/test/unit/client/query-timeout-tests.js index dbf20cf1f..36433c66a 100644 --- a/packages/pg/test/unit/client/query-timeout-tests.js +++ b/packages/pg/test/unit/client/query-timeout-tests.js @@ -32,3 +32,23 @@ test('query timeout with Submittable with callback delivers error via callback', done() }) }) + +test('handleError emits error even when callback is present', function (done) { + const query = new Query({ text: 'SELECT 1' }) + const err = new Error('boom') + let emitted = false + let called = false + + query.on('error', (emittedErr) => { + assert.equal(emittedErr, err) + emitted = true + if (called) done() + }) + query.callback = (callbackErr) => { + assert.equal(callbackErr, err) + called = true + if (emitted) done() + } + + query.handleError(err) +})