Fix #2556 by keeping callback errors from interfering with cleanup (#2753)

* Fix #2556 (handleRowDescription of null) by keeping callback errors from interfering with cleanup

* Added regression test for #2556
This commit is contained in:
Peter Rust 2022-06-20 06:25:12 -07:00 committed by GitHub
parent 28ac2a17bc
commit 68160a29bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 1 deletions

View File

@ -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)
}

View 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)
})
}
})