PM2启动Node.js应用报root用户数据库密码认证失败如何解决
故障根因
npm start 能正常运行,是因为你在当前登录的shell会话下执行命令,进程会继承当前会话里所有已加载的环境变量——包括你存在项目.env文件、或者手动export的数据库连接配置,TypeORM初始化时能正确读取到你设置的非root数据库账号,所以连接正常。
PM2是后台守护进程,启动的应用默认运行在独立的环境上下文里,不会自动加载你当前shell的环境变量,也不会主动读取项目目录下的.env配置。这时候TypeORM拿不到你配置的数据库用户名参数,就会 fallback 到默认值root去发起连接,自然触发密码认证失败的报错。
修复步骤
按优先级选以下方案操作即可:
- 方案1:使用PM2生态配置文件固定环境变量(推荐,稳定性最高)
- 在项目根目录创建
ecosystem.config.js配置文件,写入以下内容,替换成你实际的数据库配置:
如果你不想把数据库密码硬编码在配置文件里,可以在文件顶部加module.exports = { apps: [{ name: "node-app", // 自定义你的应用名称 script: "./dist/index.js", env_production: { NODE_ENV: "production", // 把你npm start时用到的所有数据库连接配置完整填在这里,和本地正常运行时的参数保持一致 DB_HOST: "localhost", DB_PORT: 5432, DB_USER: "你实际创建的数据库属主用户名", DB_PASS: "对应数据库账号的密码", DB_NAME: "你的业务库名" } }] }require('dotenv').config(),让PM2启动时自动加载项目根目录的.env文件。
2. 清理PM2里之前启动失败的旧进程:pm2 delete <你之前启动的应用名或进程ID>,如果PM2里只跑这一个应用,直接执行pm2 delete all即可。
3. 用配置文件启动生产环境进程:pm2 start ecosystem.config.js --env production
4. 执行pm2 save保存当前进程列表,保证服务器重启后应用能自动拉起。 - 在项目根目录创建
- 方案2:启动时注入当前shell环境变量
不想写额外配置文件的话,先在当前shell里加载好所有需要的环境变量(比如先执行export $(cat .env | xargs)加载.env里的配置),再执行以下命令启动:
注意这种方式如果后续重启服务器、PM2自动拉起应用时,还是可能出现环境变量丢失的问题,优先选方案1。pm2 start dist/index.js --name node-app --env production - 方案3:检查TypeORM数据源配置
打开你的数据源配置文件(即编译为dist/data-source.js的TS源文件),确认数据库用户名配置没有硬编码为root,也没有给root作为默认 fallback 值,正确写法参考:
改完源文件记得执行export const AppDataSource = new DataSource({ type: "postgres", // 替换为你实际用的数据库类型,比如mysql host: process.env.DB_HOST, port: Number(process.env.DB_PORT), username: process.env.DB_USER, // 不要写死root,不要写|| 'root'这类默认逻辑 password: process.env.DB_PASS, database: process.env.DB_NAME, entities: ["dist/entities/**/*.js"], synchronize: false, logging: false })npm run build重新编译,再重启PM2进程。
验证
启动完成后执行pm2 logs查看应用日志,没有数据库认证报错、接口可以正常响应即为修复成功。
内容的提问来源于stack exchange,提问作者Lộc Trần Phước
相关产品推荐
相关产品推荐

