8000 fix: Better error messages (#172) · ITninja04/postgres-meta@9da6ae6 · GitHub
[go: up one dir, main page]

Skip to content
8000

Commit 9da6ae6

Browse files
authored
fix: Better error messages (supabase#172)
* chore: cleaner logging output - emit a string level rather than numeric (i.e. 'error' instead of 50) - emit a readable ISO8601 timestamp instead of unix epoch time * chore: better request logging when pg header is absent or malformed * chore: better error message if query is not provided
1 parent 75ba058 commit 9da6ae6

File tree

4 files changed

+38
-11
lines changed

4 files changed

+38
-11
lines changed

src/server/app.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const app = fastify({
2020
})
2121

2222
app.setErrorHandler((error, request, reply) => {
23-
app.log.error({ error, request: extractRequestForLogging(request) })
23+
app.log.error({ error: error.toString(), request: extractRequestForLogging(request) })
2424
reply.code(500).send({ error: error.message })
2525
})
2626

src/server/routes/index.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import CryptoJS from 'crypto-js'
1+
import * as CryptoJS from 'crypto-js'
22
import { FastifyInstance } from 'fastify'
33
import { PG_CONNECTION, CRYPTO_KEY } from '../constants'
44

@@ -8,9 +8,17 @@ export default async (fastify: FastifyInstance) => {
88
// Node converts headers to lowercase
99
const encryptedHeader = request.headers['x-connection-encrypted']?.toString()
1010
if (encryptedHeader) {
11-
request.headers.pg = CryptoJS.AES.decrypt(encryptedHeader, CRYPTO_KEY).toString(
12-
CryptoJS.enc.Utf8
13-
)
11+
try {
12+
request.headers.pg = CryptoJS.AES.decrypt(encryptedHeader, CRYPTO_KEY).toString(
13+
CryptoJS.enc.Utf8
14+
)
15+
} catch (e: any) {
16+
request.log.warn({
17+
message: 'failed to parse encrypted connstring',
18+
error: e.toString(),
19+
})
20+
throw new Error('failed to process upstream connection details')
21+
}
1422
} else {
1523
request.headers.pg = PG_CONNECTION
1624
}

src/server/routes/query.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
1-
import { FastifyInstance } from 'fastify'
1+
import { FastifyInstance, FastifyRequest } from 'fastify'
22
import { PostgresMeta } from '../../lib'
33
import * as Parser from '../../lib/Parser'
44
import { DEFAULT_POOL_CONFIG } from '../constants'
55
import { extractRequestForLogging } from '../utils'
66

7+
const errorOnEmptyQuery = (request: FastifyRequest) => {
8+
if (!(request.body as any).query) {
9+
throw new Error('query not found')
10+
}
11+
}
12+
713
export default async (fastify: FastifyInstance) => {
814
fastify.post<{
915
Headers: { pg: string }
1016
Body: {
1117
query: string
1218
}
1319
}>('/', async (request, reply) => {
20+
errorOnEmptyQuery(request)
1421
const connectionString = request.headers.pg
1522

1623
const pgMeta = new PostgresMeta({ ...DEFAULT_POOL_CONFIG, connectionString })
@@ -31,6 +38,7 @@ export default async (fastify: FastifyInstance) => {
3138
query: string
3239
}
3340
}>('/format', async (request, reply) => {
41+
errorOnEmptyQuery(request)
3442
const { data, error } = Parser.Format(request.body.query)
3543

3644
if (error) {
@@ -48,6 +56,7 @@ export default async (fastify: FastifyInstance) => {
4856
query: string
4957
}
5058
}>('/parse', async (request, reply) => {
59+
errorOnEmptyQuery(request)
5160
const { data, error } = Parser.Parse(request.body.query)
5261

5362
if (error) {

src/server/utils.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
11
import { parse } from 'pg-connection-string'
22
import { FastifyRequest } from 'fastify'
33

4-
export const extractRequestForLogging = (request: FastifyRequest) => ({
5-
method: request.method,
6-
url: request.url,
7-
pg: parse(request.headers.pg as string).host,
8-
})
4+
export const extractRequestForLogging = (request: FastifyRequest) => {
5+
let pg: string = 'unknown'
6+
try {
7+
if (request.headers.pg) {
8+
pg = parse(request.headers.pg as string).host || pg
9+
}
10+
} catch (e: any) {
11+
console.warn('failed to parse PG connstring for ' + request.url)
12+
}
13+
return {
14+
method: request.method,
15+
url: request.url,
16+
pg,
17+
}
18+
}

0 commit comments

Comments
 (0)
0