You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:07:18