Visitar URL original
fix(knex): omit queries from all database error messages by marshallswain · Pull Request #3725 · feathersjs/feathers · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
fix(knex): only strip queries from database driver errors
  • Loading branch information
marshallswain committed Oct 27, 2026
commit 683722989d80c3d153a3da2bdb293993a822e704
12 changes: 11 additions & 1 deletion packages/knex/src/error-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const omitQuery = (error: any) => {
}

// MySQL drivers keep the original message
if (typeof sqlMessage === 'string' && message.endsWith(sqlMessage)) {
if (typeof sqlMessage === 'string' && sqlMessage !== '' && message.endsWith(sqlMessage)) {
const withCode = `${code}: ${sqlMessage}`

return message.endsWith(withCode) ? withCode : sqlMessage
Expand All @@ -27,6 +27,16 @@ const omitQuery = (error: any) => {
return index === -1 ? message : message.slice(0, index)
}

// Only database driver errors have the query in front of the message
if (
code === undefined &&
error.errno === undefined &&
error.number === undefined &&
error.sqlState === undefined
) {
return message
}

// SQLite messages start with the error code
const codeIndex = typeof code === 'string' ? message.lastIndexOf(` - ${code}: `) : -1
const index = codeIndex !== -1 ? codeIndex : message.lastIndexOf(' - ')
Expand Down
34 changes: 34 additions & 0 deletions packages/knex/test/error-handler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,40 @@ describe('Knex Error handler', () => {
assert.throws(() => errorHandler({ code: 'ECONNRESET' }), { name: 'GeneralError', message: 'Error' })
})

it('errors that are not from the database keep their message', () => {
assert.throws(() => errorHandler(new Error('Pool - closed')), {
name: 'GeneralError',
message: 'Pool - closed'
})
})

it('MySQL errors with an empty sqlMessage use the fallback', () => {
assert.throws(
() =>
errorHandler({
code: 'ER_X',
errno: 1,
sqlState: '42000',
sqlMessage: '',
message: 'select 1 - ER_X: oops'
} as any),
{ name: 'BadRequest', message: 'ER_X: oops' }
)
})

it('MSSQL errors omit query information', () => {
assert.throws(
() =>
errorHandler({
code: 'EREQUEST',
number: 2627,
message:
"insert into [users] ([email]) values ('a@example.com') - Violation of UNIQUE KEY constraint 'UQ_users'."
} as any),
{ name: 'GeneralError', message: "Violation of UNIQUE KEY constraint 'UQ_users'." }
)
})

it('does not leak queries or bound values from a real database', async () => {
const db = knex({ client: 'sqlite3', connection: { filename: ':memory:' }, useNullAsDefault: true })

Expand Down
Loading