You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:06:36