From c01befa477480029e07b31c8b23eca522ace71f4 Mon Sep 17 00:00:00 2001 From: Joachim Hummel Date: Fri, 17 Apr 2026 08:30:57 +0000 Subject: [PATCH] fix: Einzelner shared Pool, finally-Block verschluckt nicht Original-Fehler, Pool-Error-Handler Co-Authored-By: Claude Sonnet 4.6 --- src/server/db/client.ts | 6 +++++- src/server/db/tenant.test.ts | 8 ++++---- src/server/db/tenant.ts | 11 +++++++---- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/server/db/client.ts b/src/server/db/client.ts index 8a2474c..1c37814 100644 --- a/src/server/db/client.ts +++ b/src/server/db/client.ts @@ -1,6 +1,10 @@ import { Pool, type QueryResultRow } from 'pg' -const pool = new Pool({ connectionString: process.env.DATABASE_URL }) +export const pool = new Pool({ connectionString: process.env.DATABASE_URL }) + +pool.on('error', (err) => { + console.error({ msg: 'Idle pool connection error', error: err.message }) +}) export const db = { execute: (sql: string) => pool.query(sql), diff --git a/src/server/db/tenant.test.ts b/src/server/db/tenant.test.ts index 84e8615..73446a7 100644 --- a/src/server/db/tenant.test.ts +++ b/src/server/db/tenant.test.ts @@ -1,15 +1,15 @@ import { describe, it, expect, vi, beforeEach } from 'vitest' -// Pool mocken — gibt einen fake PoolClient zurück +// Pool aus client.ts mocken — gibt einen fake PoolClient zurück const mockClient = vi.hoisted(() => ({ query: vi.fn(), release: vi.fn(), })) -vi.mock('pg', () => ({ - Pool: vi.fn().mockImplementation(() => ({ +vi.mock('./client', () => ({ + pool: { connect: vi.fn().mockResolvedValue(mockClient), - })), + }, })) import { withTenant } from './tenant' diff --git a/src/server/db/tenant.ts b/src/server/db/tenant.ts index 6320ca9..d6a8f0e 100644 --- a/src/server/db/tenant.ts +++ b/src/server/db/tenant.ts @@ -1,6 +1,5 @@ -import { Pool, type QueryResultRow } from 'pg' - -const pool = new Pool({ connectionString: process.env.DATABASE_URL }) +import { type QueryResultRow } from 'pg' +import { pool } from './client' interface TenantClient { execute: (sql: string) => Promise @@ -25,7 +24,11 @@ export async function withTenant( } return await fn(tenantClient) } finally { - await client.query('SET search_path = public') + try { + await client.query('SET search_path = public') + } catch (resetErr) { + console.error({ msg: 'search_path reset failed', error: (resetErr as Error).message }) + } client.release() } }