如何在NestJS中通过URL、账号密码配置TypeORM连接MySQL数据库?
NestJS TypeORM 主从复制数据库连接失败解决方案
核心原因
TypeORM 主从(replication)配置规则下,每个节点(master/slave)的url参数优先级高于同层级的username、password配置,你当前代码中单独配置的用户名、密码被url参数覆盖,实际连接时没有生效,最终导致连接失败。
可选解决方案
方案一:将用户名密码直接拼接进URL
删除每个节点下的username、password配置,将认证信息直接拼入URL中,格式为mysql://[用户名]:[密码]@[host]:[port]/[database]?[其他参数]
修改后的代码示例:
createMainDBTypeOrmOptions(): TypeOrmModuleOptions { const masterUsername = encodeURIComponent(this.configDBProperties.mainMasterUsername); const masterPassword = encodeURIComponent(this.configDBProperties.mainMasterPassword); const slaveUsername = encodeURIComponent(this.configDBProperties.mainSlaveUsername); const slavePassword = encodeURIComponent(this.configDBProperties.mainSlavePassword); return { type: this.configDBProperties.mainType, replication: { master: { url: `mysql://${masterUsername}:${masterPassword}@localhost:3306/demo?useUnicode=true&characterEncoding=UTF8`, }, slaves: [ { url: `mysql://${slaveUsername}:${slavePassword}@localhost:3306/demo?useUnicode=true&characterEncoding=UTF8`, }, ], }, entities: [School, Student], // 调试时可开启日志排查问题 // logging: true }; }
注意:如果用户名/密码包含@、:等特殊字符,需要先用encodeURIComponent转义避免URL解析错误。
方案二:拆分URL参数,单独配置所有连接信息
不使用url参数,将URL中的host、port、database、参数拆分为单独字段,保留username、password配置:
createMainDBTypeOrmOptions(): TypeOrmModuleOptions { return { type: this.configDBProperties.mainType, replication: { master: { host: 'localhost', port: 3306, database: 'demo', username: this.configDBProperties.mainMasterUsername, password: this.configDBProperties.mainMasterPassword, charset: 'UTF8' }, slaves: [ { host: 'localhost', port: 3306, database: 'demo', username: this.configDBProperties.mainSlaveUsername, password: this.configDBProperties.mainSlavePassword, charset: 'UTF8' }, ], }, entities: [School, Student], // 调试时可开启日志排查问题 // logging: true }; }
补充说明
你之前看到的将username改为user的配置规则,仅适用于无主从复制配置、直接在全局填写单个url的场景,主从配置下该规则不生效。
内容的提问来源于stack exchange,提问作者Joonseo Lee
相关产品推荐
相关产品推荐

