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

Serverless PostgreSQL连接意外终止问题排查求助

问题排查:Serverless调用CreateUser时PostgreSQL连接意外终止

错误日志

POST /signup (λ: signup)
    Error: Connection terminated unexpectedly
        at Connection.<anonymous> (/Volumes/Work/Learning/CWJ MicroServices/cwj-serverless-nodejs/user-service/node_modules/pg/lib/client.js:132:73)
        at Object.onceWrapper (node:events:625:28)
        at Connection.emit (node:events:511:28)
        at Socket.<anonymous> (/Volumes/Work/Learning/CWJ MicroServices/cwj-serverless-nodejs/user-service/node_modules/pg/lib/connection.js:62:12)
        at Socket.emit (node:events:511:28)
        at TCP.<anonymous> (node:net:334:12)
    (λ: signup) RequestId: 02ec07bb-c20a-411c-adea-9db11d368c4c  Duration: 209.11 ms  Billed Duration: 210 ms

相关代码

userRepo.ts

import { UserModel } from "../models/UserModel";
import { DBClient } from "../utility/databaseClient";
export class UserRespository {
  constructor() {}

  async createAccount({ email, password, salt, phone, userType }: UserModel) {
    const client = await DBClient();
    await client.connect();
    const queryString =
      "INSERT INTO users(phone,email,password,salt,user_type) VALUES($1,$2,$3,$4,$5) RETURNING *";
    const values = [phone, email, password, salt, userType];
    const result = await client.query(queryString, values);
    await client.end();
    if (result.rowCount > 0) {
      return result.rows[0] as UserModel;
    }
  }
}

databaseClient.ts

import { Client } from "pg";

export const DBClient = () => {
  return new Client({
    host: "127.0.0.1",
    user: "root",
    database: "user_service",
    password: "root",
    port: 5433,
  });
};

排查方向与解决办法

1. 本地Serverless环境无法访问Docker中的PostgreSQL(最可能原因)

Serverless Offline运行的Lambda进程默认使用自身网络命名空间,127.0.0.1指向Lambda进程内部,而非宿主机上的Docker容器。解决方式:

  • Mac/Windows环境:将databaseClient.ts中的host改为host.docker.internal,这是Docker提供的宿主机别名,可直接访问宿主机服务;
  • Linux环境:
    • 找到宿主机内部IP(通过ifconfig查看docker0或eth0的IP)替换127.0.0.1;
    • 或者启动PostgreSQL容器时添加--network host参数,让容器共享宿主机网络,此时127.0.0.1即可访问。

2. 数据库连接参数验证

  • 确认Docker端口映射:执行docker ps查看容器端口,确保是0.0.0.0:5433->5432/tcp(PostgreSQL容器内部默认端口为5432);
  • 核对容器环境变量:确认POSTGRES_USER=root、POSTGRES_PASSWORD=root、POSTGRES_DB=user_service与代码配置完全一致。

3. 优化数据库连接管理

当前代码每次请求创建新连接,在Serverless环境下易引发连接开销过高、中断问题,建议改用连接池:

修改databaseClient.ts为连接池模式

import { Pool } from "pg";

export const dbPool = new Pool({
  host: "host.docker.internal", // 替换为正确的host地址
  user: "root",
  database: "user_service",
  password: "root",
  port: 5433,
  max: 10, // 最大连接数
  idleTimeoutMillis: 30000, // 空闲连接超时时间
});

修改userRepo.ts使用连接池

import { UserModel } from "../models/UserModel";
import { dbPool } from "../utility/databaseClient";
export class UserRespository {
  constructor() {}

  async createAccount({ email, password, salt, phone, userType }: UserModel) {
    const queryString =
      "INSERT INTO users(phone,email,password,salt,user_type) VALUES($1,$2,$3,$4,$5) RETURNING *";
    const values = [phone, email, password, salt, userType];
    const result = await dbPool.query(queryString, values);
    if (result.rowCount > 0) {
      return result.rows[0] as UserModel;
    }
  }
}

4. 防火墙/安全组限制

临时关闭本地防火墙测试连接是否恢复,若恢复则添加规则允许Serverless进程访问5433端口。


内容的提问来源于stack exchange,提问作者Anon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:12:47