在Heroku部署Express+Sequelize+Postgres时遇权限提升错误
首先看你遇到的错误:
[2018-05-16 08:27:12.979] [ERROR] server - Pipe postgres://xnmcmqfirrdzkg:638d94fcd7aa5178e1054f0ff604613826033d5e8845fb42614c17a3d386823a@ec2-107-21-126-193.compute-1.amazonaws.com:5432/d5l5g60nk6l27a requires elevated privileges
你提到正在Heroku上部署Express+Sequelize+Postgres服务器,用的是默认数据凭证,初始化代码如下:
if (config.use_env_variable) { var sequelize = new Sequelize(process.env[config.use_env_variable]); } else { config.logging = function (str) { log4js.getLogger("sequelize").info(str); } var sequelize = new Sequelize(config.database, config.username, config.password, config); }
这个错误通常和Sequelize的连接配置不当有关,给你几个排查和解决的方向:
1. 移除多余的Pipe协议设置
打开你的Sequelize配置文件(比如config.json或环境配置文件),检查是否手动设置了protocol: 'pipe'。Heroku提供的DATABASE_URL已经包含了正确的postgres://协议,额外指定pipe参数会触发权限问题,直接删掉这个配置项即可。
2. 确认正确绑定Heroku的DATABASE_URL
Heroku在你添加Postgres插件后,会自动把完整的数据库连接字符串注入到DATABASE_URL环境变量中。你需要确保config.use_env_variable的值就是DATABASE_URL,这样Sequelize会直接读取这个官方提供的连接信息,避免手动拼接凭证带来的错误。
3. 添加SSL配置(关键步骤)
Heroku的Postgres强制要求SSL连接,所以你需要在生产环境的Sequelize配置里加上SSL相关设置,示例配置如下:
{ "production": { "use_env_variable": "DATABASE_URL", "dialect": "postgres", "dialectOptions": { "ssl": { "require": true, "rejectUnauthorized": false } } } }
这里rejectUnauthorized: false是因为Heroku的Postgres证书无法被本地信任链识别,加上这个配置可以绕过SSL验证错误。
4. 重新部署并验证环境变量
修改配置后,执行git push heroku main重新部署应用,然后用heroku config:get DATABASE_URL命令确认环境变量是否正常存在,确保Sequelize能正确读取到它。
按照这些步骤调整后,应该就能解决这个权限错误了。
内容的提问来源于stack exchange,提问作者Cường Nguyễn

