TypeScript连接PostgreSQL无响应无报错问题求助
排查TypeScript连接PostgreSQL无响应问题
你的问题核心是client.connect()一直处于pending状态,既不完成也不抛出错误,导致后续代码和Promise回调都无法执行。以下是具体排查步骤和修复方案:
1. 强制设置连接超时,触发错误反馈
默认情况下pg的连接超时可能设置得很长(甚至无限制),导致进程一直等待而无输出。手动添加超时配置,让连接失败时快速抛出错误:
修改Client初始化代码:
const client = new Client({ ...env.database, connectionTimeoutMillis: 5000, // 5秒超时,可根据实际调整 });
2. 监听Client的error事件
pg的Client实例会在底层出现连接错误时触发error事件,如果没有监听这个事件,错误可能不会被Promise捕获,甚至导致进程静默挂起。添加事件监听:
const client = new Client({ ...env.database, connectionTimeoutMillis: 5000, }); // 监听底层连接错误 client.on('error', (err) => { console.error('数据库底层连接错误:', err); process.exit(1); });
3. 验证连接参数的正确性
检查env.database是否包含所有必填字段,避免参数缺失或错误:
host: 数据库服务器地址(默认localhost)port: 数据库端口(默认5432)user: 数据库用户名password: 数据库密码database: 要连接的目标数据库名称
可以直接打印参数确认:
console.log('当前连接参数:', env.database);
4. 用psql命令测试数据库连通性
先排除网络、权限或数据库服务本身的问题,在终端执行:
psql -h <host> -p <port> -U <user> -d <database>
如果这个命令也无法连接,说明是数据库环境配置问题(比如防火墙拦截、用户权限不足、服务未启动),和代码无关。
5. 修复seed.sql执行的潜在问题
即使连接成功,你的client.query调用也存在问题:fs.readFileSync默认返回Buffer,需要转成字符串;且seed.sql通常是批量SQL语句,不需要传入参数。修改为:
const seedSql = fs.readFileSync("./seed.sql", 'utf8'); const res = await client.query(seedSql);
修改后的完整代码
import { Client } from 'pg'; import { env } from "./integration.env"; import fs from 'fs'; async function resetDatabase(): Promise<void> { const client = new Client({ ...env.database, connectionTimeoutMillis: 5000, }); client.on('error', (err) => { console.error('数据库底层错误:', err); process.exit(1); }); console.log("before connect"); console.log('连接参数:', env.database); try { await client.connect(); console.log("after connect"); const seedSql = fs.readFileSync("./seed.sql", 'utf8'); const res = await client.query(seedSql); console.log("SQL执行完成,影响行数:", res.rowCount); await client.end(); } catch (err) { console.error('数据库操作失败:', err); await client.end(); throw err; } } resetDatabase() .then(() => console.log("ok")) .catch((err) => console.log("no", err));
关键说明
- 连接超时设置能快速暴露网络或配置问题,避免进程无限等待
- 监听
error事件可以捕获那些未被Promise封装的底层错误 - 先通过psql验证连通性,能快速区分是代码问题还是数据库环境问题
内容的提问来源于stack exchange,提问作者Thibaud
相关产品推荐
相关产品推荐

