SvelteKit应用启动时仅初始化PostgreSQL连接池的代码位置咨询
在SvelteKit中初始化PostgreSQL连接池(仅执行一次)
在SvelteKit中,利用Node.js模块的单例加载特性就能实现连接池仅初始化一次,同时让所有服务端端点都能访问。具体方案如下:
实现步骤
1. 创建服务端专属的数据库模块
在src/lib/server目录下新建db.js(或db.ts)文件,这个目录下的代码只会在服务端运行,不会被打包到客户端。
2. 在模块中初始化连接池
在这个文件里完成pg连接池的初始化,代码只会在模块第一次被导入时执行一次:
import { Pool } from 'pg'; import { DATABASE_URL } from '$env/static/private'; // 初始化连接池,仅执行一次 const pool = new Pool({ connectionString: DATABASE_URL, // 可选配置:根据你的需求调整连接池参数 max: 20, // 最大连接数 idleTimeoutMillis: 30000, // 闲置连接超时时间 connectionTimeoutMillis: 2000 // 连接超时时间 }); // 可选:封装通用查询函数,简化端点中的使用 export async function query(text, params) { const res = await pool.query(text, params); return res; } // 导出连接池实例,供需要底层操作的场景使用 export default pool;
3. 在端点中导入使用
在任意服务端端点(比如+server.js或API路由)中直接导入这个模块,就能复用已初始化的连接池:
import { query } from '$lib/server/db'; import { json } from '@sveltejs/kit'; export async function POST({ request }) { const { username } = await request.json(); // 使用封装好的查询函数 const userResult = await query('SELECT id, username FROM users WHERE username = $1', [username]); if (userResult.rows.length === 0) { return json({ success: false }, { status: 401 }); } return json({ success: true, user: userResult.rows[0] }); }
关键说明
- Node.js模块是单例加载的:无论你在多少个端点中导入
db.js,这个文件只会被执行一次,连接池也就只会初始化一次。 - 敏感信息安全:通过
$env/static/private读取环境变量(比如DATABASE_URL),这些变量不会暴露给客户端。 - 开发模式兼容:SvelteKit开发时的热重载可能会重新加载模块,但
pg连接池会自动处理连接复用,无需额外操作。 - 客户端禁止导入:不要在客户端组件(比如
+page.svelte)中导入这个模块,否则会因为缺少Node.js环境报错。
内容的提问来源于stack exchange,提问作者zmehall
相关产品推荐
相关产品推荐

