Skip to content

Commit 236db38

Browse files
johanneswuerbachbrianc
authored andcommitted
Handle client errors in pool.query (#131)
If an error not related to the query occurs, the client is emitting an error event. Forward this event to the callback.
1 parent c8c41c5 commit 236db38

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

index.js

+18
Original file line numberDiff line numberDiff line change
@@ -316,13 +316,31 @@ class Pool extends EventEmitter {
316316
}
317317
const response = promisify(this.Promise, cb)
318318
cb = response.callback
319+
319320
this.connect((err, client) => {
320321
if (err) {
321322
return cb(err)
322323
}
324+
325+
let clientReleased = false
326+
const onError = (err) => {
327+
if (clientReleased) {
328+
return
329+
}
330+
clientReleased = true
331+
client.release(err)
332+
cb(err)
333+
}
334+
335+
client.once('error', onError)
323336
this.log('dispatching query')
324337
client.query(text, values, (err, res) => {
325338
this.log('query dispatched')
339+
client.removeListener('error', onError)
340+
if (clientReleased) {
341+
return
342+
}
343+
clientReleased = true
326344
client.release(err)
327345
if (err) {
328346
return cb(err)

test/error-handling.js

+15
Original file line numberDiff line numberDiff line change
@@ -226,4 +226,19 @@ describe('pool error handling', function () {
226226
})
227227
})
228228
})
229+
230+
it('handles post-checkout client failures in pool.query', (done) => {
231+
const pool = new Pool({ max: 1 })
232+
pool.on('error', () => {
233+
// We double close the connection in this test, prevent exception caused by that
234+
})
235+
pool.query('SELECT pg_sleep(5)', [], (err) => {
236+
expect(err).to.be.an(Error)
237+
done()
238+
})
239+
240+
setTimeout(() => {
241+
pool._clients[0].end()
242+
}, 1000)
243+
})
229244
})

0 commit comments

Comments
 (0)