Sequelize连接PostgreSQL未用指定用户名,报角色不存在错误
Sequelize连接PostgreSQL时忽略配置用户,使用系统用户名的问题
我尝试通过Sequelize连接本地PostgreSQL数据库,使用pgAdmin以postgres用户、无密码可正常访问。
向Sequelize构造函数传入以下配置:
const sequelize = new Sequelize({ dialect: 'postgres', database: 'green', user: 'postgres', password: '', host: 'localhost', port: 5432, ssl: true, clientMinMessages: 'notice', });
但收到错误:[SequelizeConnectionError]: role "MyActualName" does not exist
已确认项目中未出现过MyActualName这个名称,且排查包内代码发现,创建连接时connectionConfig对象包含设置的host、database、password和port,但user属性为undefined。
已尝试的操作
- 添加拥有全部权限的新用户并设置密码,仍出现相同错误
- 将PG认证方式从"trust"改为md5并重启PG,问题依旧
- 本地另一应用Prisma使用相同用户连接同一服务器的其他数据库可正常运行
解决方法
修正配置参数名
部分Sequelize版本中,用户名的配置参数是username而非user,使用user会被驱动忽略,导致默认读取系统用户名。将配置里的user替换为username:const sequelize = new Sequelize({ dialect: 'postgres', database: 'green', username: 'postgres', password: '', host: 'localhost', port: 5432, ssl: true, clientMinMessages: 'notice', });检查环境变量干扰
PostgreSQL驱动会优先读取PGUSER环境变量作为用户名,如果该变量被设置为你的系统用户名,会直接覆盖配置参数。可以在代码开头打印console.log(process.env.PGUSER)确认,若存在则删除该环境变量,或在代码中显式覆盖:process.env.PGUSER = 'postgres'; const sequelize = new Sequelize({...});排查配置格式混用
确认未混用URL连接格式与对象配置格式,若项目中存在连接字符串相关的残留逻辑,可能会覆盖当前的对象配置参数。
内容的提问来源于stack exchange,提问作者Randy Hall
相关产品推荐
相关产品推荐

