mirror of
https://github.com/brianc/node-postgres.git
synced 2026-01-18 15:55:05 +00:00
* Fix #2556 (handleRowDescription of null) by keeping callback errors from interfering with cleanup * Added regression test for #2556
This commit is contained in:
parent
28ac2a17bc
commit
68160a29bd
@ -135,7 +135,14 @@ class Query extends EventEmitter {
|
||||
return this.handleError(this._canceledDueToError, con)
|
||||
}
|
||||
if (this.callback) {
|
||||
this.callback(null, this._results)
|
||||
try {
|
||||
this.callback(null, this._results)
|
||||
}
|
||||
catch(err) {
|
||||
process.nextTick(() => {
|
||||
throw err
|
||||
})
|
||||
}
|
||||
}
|
||||
this.emit('end', this._results)
|
||||
}
|
||||
|
||||
40
packages/pg/test/integration/gh-issues/2556-tests.js
Normal file
40
packages/pg/test/integration/gh-issues/2556-tests.js
Normal file
@ -0,0 +1,40 @@
|
||||
'use strict'
|
||||
var helper = require('./../test-helper')
|
||||
var assert = require('assert')
|
||||
|
||||
var callbackError = new Error('TEST: Throw in callback')
|
||||
|
||||
const suite = new helper.Suite()
|
||||
|
||||
suite.test('it should cleanup client even if an error is thrown in a callback', (done) => {
|
||||
// temporarily replace the test framework's uncaughtException handlers
|
||||
// with a custom one that ignores the callbackError
|
||||
let original_handlers = process.listeners('uncaughtException')
|
||||
process.removeAllListeners('uncaughtException')
|
||||
process.on('uncaughtException', (err) => {
|
||||
if (err != callbackError) {
|
||||
original_handlers[0](err)
|
||||
}
|
||||
})
|
||||
|
||||
// throw an error in a callback and verify that a subsequent query works without error
|
||||
var client = helper.client()
|
||||
client.query('SELECT NOW()', (err) => {
|
||||
assert(!err)
|
||||
setTimeout(reuseClient, 50)
|
||||
throw callbackError
|
||||
})
|
||||
|
||||
function reuseClient() {
|
||||
client.query('SELECT NOW()', (err) => {
|
||||
assert(!err)
|
||||
|
||||
// restore the test framework's uncaughtException handlers
|
||||
for (let handler of original_handlers) {
|
||||
process.on('uncaughtException', handler)
|
||||
}
|
||||
|
||||
client.end(done)
|
||||
})
|
||||
}
|
||||
})
|
||||
Loading…
x
Reference in New Issue
Block a user