TypeORM生成迁移时报错:SASL客户端密码必须为字符串
解决TypeORM迁移时的SASL密码错误
出现SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string错误,核心原因是TypeORM拿到的数据库密码不是有效字符串,大概率是环境变量加载异常或未正确配置,按以下步骤排查:
检查.env文件配置
确保.env文件里的DATABASE_PASSWORD是有效字符串,无多余空格或空值,格式示例:DATABASE_HOST=localhost DATABASE_PORT=5432 DATABASE_USERNAME=postgres DATABASE_PASSWORD=your_real_password确保dotenv正确加载环境变量
如果.env不在项目根目录,需给config()指定路径,比如data-source.ts在src目录,.env在根目录,修改如下:import { config } from "dotenv"; import path from "path"; config({ path: path.join(__dirname, "../.env") });同时调整代码顺序,让dotenv加载逻辑放在最前面,避免变量未初始化就被使用:
// 优先加载环境变量 import { config } from "dotenv"; import path from "path"; config({ path: path.join(__dirname, "../.env") }); // 再导入其他模块 import {DataSource} from "typeorm"; import {User} from "./entity/User"; export const AppDataSource = new DataSource({ type: "postgres", host: process.env.DATABASE_HOST, port: parseInt(process.env.DATABASE_PORT || "5432"), // 给端口也加兜底值 username: process.env.DATABASE_USERNAME, password: process.env.DATABASE_PASSWORD || "", // 兜底避免undefined logging: true, entities: [User], migrations: [path.join(__dirname, "./migration/*")], });给密码字段加类型兜底
若确认环境变量一定存在,可强制转换为字符串;或设置默认空字符串,避免传入undefined:// 强制类型转换(需确保环境变量存在) password: process.env.DATABASE_PASSWORD as string, // 更安全的空值兜底 password: process.env.DATABASE_PASSWORD ?? "",临时命令行指定密码测试
若怀疑是.env加载问题,直接在执行命令时临时传入密码验证:DATABASE_PASSWORD=your_password yarn typeorm-ts-node-esm -d ./dist/data-source.js migration:generate ./src/migration/init能正常执行则说明是.env文件的加载或配置存在问题。
内容的提问来源于stack exchange,提问作者Stefan Dimitrov
相关产品推荐
相关产品推荐

