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

如何正确解决Heroku Node.js连接Heroku Postgres出现sql_error_code=28000报错

报错根本原因
  • Heroku Postgres生产级实例强制要求所有数据库连接使用SSL加密,未启用SSL的请求会被直接拦截,你看到的28000错误提示里的SSL off就是未启用SSL的明确标识。
  • 你混淆了两个独立的SSL链路:Heroku为你的Next.js应用配置的SSL,是面向终端用户访问站点时的传输加密;而本次报错对应的是你的Next.js后端作为客户端,连接PostgreSQL服务端时的传输加密,前者的默认配置不会自动作用于后者,所以会出现未开启SSL的问题。
临时方案的安全风险

你找到的取消ssl注释、设置rejectUnauthorized: false的方案,本质是跳过SSL证书校验步骤,即使遇到伪造、过期的非法证书也会继续建立连接,等于放弃了SSL的身份验证能力,很容易遭遇中间人攻击,绝对不能在生产环境长期使用。

符合安全规范的修复方案

你可以任选以下任意一种方案,不需要关闭证书校验即可正常连接:

  • 方案一:添加环境变量(无代码改动)
    在Heroku控制台的应用环境变量配置页,新增变量PGSSLMODE=require,重新发布应用后即可生效。pg库会自动读取该环境变量,为所有数据库连接启用SSL并正常校验证书。
  • 方案二:修改连接字符串
    在原有的数据库连接字符串后追加ssl参数即可,代码如下:
    const pool = new Pool({
        connectionString: process.env.DATABASE_URL + '?sslmode=require',
    })
    
  • 方案三:显式配置可信证书
    如果上述方案仍有证书校验问题,可以下载Heroku Postgres的官方根证书内置到项目中,显式传入证书完成校验:
    const fs = require('fs')
    const pool = new Pool({
        connectionString: process.env.DATABASE_URL,
        ssl: {
            ca: fs.readFileSync('./heroku-postgres-root.crt').toString()
        }
    })
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:36:07