Sequelize连接Google Cloud SQL(PostgreSQL)报错:服务器不支持SSL连接
问题背景
我在将Node.js/Sequelize应用的模型迁移至Google Cloud托管的PostgreSQL数据库时遇到异常:GCP已设置为仅允许SSL连接,且能通过Postico2、BeeKeeper Studio使用SSL证书成功连接数据库,但执行NODE_ENV=production npx sequelize db:migrate时,报错如下:
Sequelize CLI [Node: 19.0.0, CLI: 6.6.0, ORM: 6.29.3] ** config.js ** Loaded configuration file "config/config.js". Using environment "production". **ERROR: The server does not support SSL connections**
开发和测试环境迁移正常,且用pg原生客户端(Client/Pool)能成功连接GCP PostgreSQL,但Sequelize配置始终无法正常工作。
可能的原因及解决办法
1. SSL配置冲突+证书格式问题
当前配置同时设置了顶层ssl: true和dialectOptions.ssl,可能导致Sequelize向pg客户端传递的SSL配置冲突;另外fs.readFileSync默认返回Buffer,而pg客户端要求证书内容为字符串格式,这也是原生pg代码能成功但Sequelize失败的关键差异。
修改production配置如下:
production: { username: process.env.PROD_DB_USERNAME, password: process.env.PROD_DB_PASSWORD, database: process.env.PROD_DB_NAME, host: process.env.PROD_DB_HOSTNAME, port: process.env.PROD_DB_PORT, dialect: 'postgres', // 移除顶层ssl: true,避免配置冲突 dialectOptions: { ssl: { require: true, rejectUnauthorized: false, // 将读取的Buffer转换为字符串格式 ca: fs.readFileSync(path.join(__dirname,'..','ssl','server-ca.pem')).toString(), cert: fs.readFileSync(path.join(__dirname,'..','ssl','client-cert.pem')).toString(), key: fs.readFileSync(path.join(__dirname,'..','ssl','client-key.pem')).toString() } }, debug: true }
2. 验证证书路径正确性
由于通过.sequelizerc加载配置,可能存在__dirname路径指向不符合预期的情况,导致证书文件无法读取。可在config.js中添加日志打印确认:
// 在production配置上方添加 const caPath = path.join(__dirname,'..','ssl','server-ca.pem'); console.log('CA证书路径:', caPath); console.log('CA证书是否存在:', fs.existsSync(caPath));
执行迁移命令时查看控制台输出,确保证书路径正确且文件存在。
3. 确认环境变量正确传递
确保执行迁移命令时,所有PROD_DB_*开头的环境变量已正确设置,避免因环境变量缺失导致连接到错误的数据库(比如本地未开启SSL的PostgreSQL)。可在config.js中添加打印:
console.log('生产环境DB主机:', process.env.PROD_DB_HOSTNAME); console.log('生产环境DB端口:', process.env.PROD_DB_PORT);
验证
修改配置后,重新执行迁移命令:
NODE_ENV=production npx sequelize db:migrate
若配置正确,应能成功完成迁移。
内容的提问来源于stack exchange,提问作者Jason Jacobson

