AdonisJS 5部署至DigitalOcean时.env变量缺失问题求助
解决AdonisJS 5部署DigitalOcean时.env变量缺失问题
问题场景
在DigitalOcean的Ubuntu服务器上部署AdonisJS 5 API,进入build目录执行迁移命令时触发E_MISSING_ENV_VALUE错误,提示缺失DB_CONNECTION环境变量,但项目根目录的.env文件已明确声明该变量。
执行命令及错误输出:
gmh@ubuntu-gmh:~/www/gmh-api$ cd build gmh@ubuntu-gmh:~/www/gmh-api/build$ node ace migration:run --force Exception E_MISSING_ENV_VALUE: Missing environment variable "DB_CONNECTION"
.env文件内容:
PORT=3333 HOST=127.0.0.1 NODE_ENV=production DRIVE_DISK=local DB_CONNECTION=mysql
数据库配置片段:
connection: Env.get('DB_CONNECTION'), connections: { mysql: { client: 'mysql2', connection: { host: Env.get('MYSQL_HOST'), port: Env.get('MYSQL_PORT'), user: Env.get('MYSQL_USER'), password: Env.get('MYSQL_PASSWORD', ''), database: Env.get('MYSQL_DB_NAME'), }, } }
解决方案
确保.env文件在执行目录
AdonisJS的Env模块默认从当前工作目录加载.env文件。你在build目录执行命令,但.env可能还在项目根目录。可以:- 复制根目录的.env到build目录:
cp ~/www/gmh-api/.env ~/www/gmh-api/build/ - 直接在项目根目录执行迁移(指定build下的ace):
node build/ace migration:run --force
- 复制根目录的.env到build目录:
处理生产环境的.env加载逻辑
当NODE_ENV=production时,AdonisJS默认不会自动加载.env文件(出于安全考虑,推荐用服务器环境变量注入)。如果需要强制加载,可:- 执行命令时显式指定.env路径:
node ace migration:run --force --env-file=../.env - 或者在代码中手动初始化Env模块时指定文件路径:
import { Env } from '@adonisjs/core/build/standalone' await Env.load(__dirname + '/../.env') // 根据实际路径调整
- 执行命令时显式指定.env路径:
验证环境变量权限与可用性
先在build目录检查变量是否能被读取:
# 用Shell检查 echo $DB_CONNECTION # 用Node.js检查 node -e "console.log(process.env.DB_CONNECTION)"
如果输出为空,检查文件权限:
chmod 644 ~/www/gmh-api/build/.env
- 调整构建配置自动复制.env
修改adonisrc.json的metaFiles数组,确保构建时将.env复制到build目录:
"metaFiles": [ ".env", // 保留其他已有的元文件配置 ]
然后重新执行构建:
node ace build --production
内容的提问来源于stack exchange,提问作者Fenibo Fubara
相关产品推荐
相关产品推荐

