Sequelize迁移无法读取dotenv变量,数据库连接被拒绝求助
我之前也碰到过一模一样的情况——用nodemon启动服务器时数据库连接完全正常,一跑npx sequelize-cli db:migrate就报connect ECONNREFUSED 127.0.0.1:3306,本质原因就是Sequelize-CLI执行迁移命令时,没有正确加载你的dotenv环境变量,导致config.js里的process.env.xxx全是undefined,只能用默认配置去连数据库,自然就失败了。
给你几个实用的解决方案,按需选择:
方案1:修改config.js,确保dotenv加载正确路径
大概率是你的config.js放在config/目录下,而.env文件在项目根目录,默认的dotenv.config()会从当前脚本所在目录查找.env,所以找不到。修改config.js的开头部分,指定.env的绝对路径即可:
const path = require('path'); // 从config目录向上定位到项目根目录的.env文件 require("dotenv").config({ path: path.resolve(__dirname, '../.env') }); module.exports = { // 你的原有配置内容... };
这样不管是sequelize-cli执行迁移,还是nodemon启动服务,都能正确读取到.env里的变量。
方案2:用dotenv-cli在命令行注入环境变量
如果不想修改代码,可以借助dotenv-cli工具,先安装它:
npm install dotenv-cli --save-dev
然后在执行迁移命令前加上dotenv-cli的前缀:
npx dotenv-cli sequelize-cli db:migrate
它会自动加载项目根目录的.env文件,把环境变量注入到sequelize-cli的执行环境中。
方案3:在package.json中添加自定义脚本(最推荐)
为了避免每次都敲长命令,直接在package.json的scripts里配置快捷命令:
{ "scripts": { "db:migrate": "dotenv-cli sequelize-cli db:migrate", "db:migrate:undo": "dotenv-cli sequelize-cli db:migrate:undo", "db:seed": "dotenv-cli sequelize-cli db:seed:all" } }
之后执行迁移只需要敲:
npm run db:migrate
既方便又不容易出错。
顺便解释下为什么nodemon没问题:你用nodemon启动的是服务器入口文件(比如app.js或server.js),这个入口文件里肯定已经正确加载了dotenv,所以整个服务进程的process.env是有效的;但sequelize-cli是直接执行你的config.js,若config.js里的dotenv加载路径不对,自然拿不到环境变量。
内容的提问来源于stack exchange,提问作者byyoung

