You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker容器中Node.js TypeScript API连接PostgreSQL成功但表关系无法访问

Docker容器中Node.js TypeScript API连接PostgreSQL成功但表关系无法访问

看起来你遇到了Docker+PostgreSQL组合里挺典型的问题——明明日志显示数据库连接成功了,但就是找不到对应的operators表,报relation "operators" does not exist错对吧?我帮你梳理几个大概率的原因和解决思路:

1. 数据库初始化脚本没执行或执行时机不对

本地运行时,你可能早就手动创建了表,或者API启动时会自动跑建表/迁移脚本,但Docker环境下情况不一样:

  • 要么是API容器启动得比数据库容器还快,数据库还没完全就绪,建表脚本执行失败;
  • 要么是你没把执行建表脚本的步骤加到Docker配置里,导致容器里的数据库是空的。

解决办法

  • 如果用Docker Compose,给数据库容器加健康检查,让API容器等数据库完全就绪再启动。比如在docker-compose.yml里给postgres服务加:
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5
    
    然后API服务加depends_on并指定依赖健康状态:
    depends_on:
      postgres:
        condition: service_healthy
    
  • 确保启动API前先执行建表脚本,比如在Dockerfile的CMD里改成:
    CMD ["sh", "-c", "npx prisma migrate deploy && node dist/index.js"]
    
    (如果用的是其他ORM或手动SQL脚本,替换成对应的命令即可)

2. 数据库连接配置和本地不一致

虽然日志显示连接成功,但可能你连的是一个和本地不一样的数据库实例:

  • 本地用localhost当数据库host,但Docker里得用数据库容器的名称(比如postgres)才能访问;
  • 环境变量里的数据库名、用户名和本地不一样,比如本地用的是mydb,但Docker里postgres容器默认创建的是postgres库,导致你连到了空库。

解决办法

  • 检查API的环境变量配置,确保DB_HOST是Docker Compose里postgres服务的名称,DB_NAMEDB_USERDB_PASSWORD和postgres容器的配置完全匹配;
  • 可以进入postgres容器里用psql命令验证:
    docker exec -it <postgres-container-name> psql -U <db-user> -d <db-name>
    
    然后用\dt命令查看是否存在operators表。

3. 表的权限或Schema问题

还有两种常见小坑:

  • 你的数据库用户没有创建表的权限,导致建表脚本执行失败但没抛出明显错误;
  • 表是创建在非默认的Schema下,而API查询时没指定Schema,默认找public下的表。

解决办法

  • 给数据库用户赋予足够的权限,比如在postgres容器里执行:
    GRANT ALL PRIVILEGES ON DATABASE <db-name> TO <db-user>;
    GRANT ALL PRIVILEGES ON SCHEMA public TO <db-user>;
    
  • 如果表在其他Schema里,要么修改API的连接配置指定默认Schema,要么在查询语句里加上Schema前缀,比如SELECT * FROM my_schema.operators

附上你提供的服务器日志:

[7/10/2024, 1:26:07 PM] [INFO] [0] [index.ts]  Server is running on http://localhost:3000
[7/10/2024, 1:26:13 PM] [INFO] [0] [db.config]  Connected to the db
[7/10/2024, 1:26:13 PM] [ERROR] [0] [operator.signup.controller] error: relation "operators" does not exist
    at /app/node_modules/pg-pool/index.js:45:11
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
  length: 108,
  severity: 'ERROR',
  code: '42P01',
  detail: undefined,
  hint: undefined,
  position: '13',
  internalPosition: undefined,
  internalQuery: undefined,
  where: undefined,
  schema: undefined,
  table: undefined,
  column: undefined,
  dataType: undefined,
  constraint: undefined,
  file: 'parse_relation.c',
  line: '1392...

备注:内容来源于stack exchange,提问作者Aditi Polkam

火山引擎 最新活动