Visitar URL original
fix(knex): only strip queries from database driver errors · feathersjs/feathers@6837229 · GitHub
Skip to content

Commit 6837229

Browse files
committed
fix(knex): only strip queries from database driver errors
1 parent 7a77a0a commit 6837229

2 files changed

Lines changed: 45 additions & 1 deletion

File tree

‎packages/knex/src/error-handler.ts‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const omitQuery = (error: any) => {
1515
}
1616

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

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

30+
// Only database driver errors have the query in front of the message
31+
if (
32+
code === undefined &&
33+
error.errno === undefined &&
34+
error.number === undefined &&
35+
error.sqlState === undefined
36+
) {
37+
return message
38+
}
39+
3040
// SQLite messages start with the error code
3141
const codeIndex = typeof code === 'string' ? message.lastIndexOf(` - ${code}: `) : -1
3242
const index = codeIndex !== -1 ? codeIndex : message.lastIndexOf(' - ')

‎packages/knex/test/error-handler.test.ts‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,40 @@ describe('Knex Error handler', () => {
223223
assert.throws(() => errorHandler({ code: 'ECONNRESET' }), { name: 'GeneralError', message: 'Error' })
224224
})
225225

226+
it('errors that are not from the database keep their message', () => {
227+
assert.throws(() => errorHandler(new Error('Pool - closed')), {
228+
name: 'GeneralError',
229+
message: 'Pool - closed'
230+
})
231+
})
232+
233+
it('MySQL errors with an empty sqlMessage use the fallback', () => {
234+
assert.throws(
235+
() =>
236+
errorHandler({
237+
code: 'ER_X',
238+
errno: 1,
239+
sqlState: '42000',
240+
sqlMessage: '',
241+
message: 'select 1 - ER_X: oops'
242+
} as any),
243+
{ name: 'BadRequest', message: 'ER_X: oops' }
244+
)
245+
})
246+
247+
it('MSSQL errors omit query information', () => {
248+
assert.throws(
249+
() =>
250+
errorHandler({
251+
code: 'EREQUEST',
252+
number: 2627,
253+
message:
254+
"insert into [users] ([email]) values ('a@example.com') - Violation of UNIQUE KEY constraint 'UQ_users'."
255+
} as any),
256+
{ name: 'GeneralError', message: "Violation of UNIQUE KEY constraint 'UQ_users'." }
257+
)
258+
})
259+
226260
it('does not leak queries or bound values from a real database', async () => {
227261
const db = knex({ client: 'sqlite3', connection: { filename: ':memory:' }, useNullAsDefault: true })
228262

0 commit comments

Comments
 (0)