如何通过Mocha、dotenv、esm加载自定义.env配置文件?
你的问题核心在于Mocha会把命令行中未被选项匹配的参数当作测试文件路径,所以你之前写的dotenv_config_path=./env/dev-config.env被Mocha当成了要执行的测试文件,自然会报错找不到文件。下面给你几种可靠的解决方案:
1. 命令行正确传递dotenv参数
把dotenv_config_path参数直接附加在-r dotenv/config的后面,让Node的require机制处理这个参数,而不是让Mocha捕获它。有两种写法:
写法一:直接跟在require选项后
mocha -r dotenv/config dotenv_config_path=./env/dev-config.env -r esm --recursive --exit
注意:dotenv_config_path=...必须紧跟在-r dotenv/config之后,Mocha会把这个参数传递给dotenv/config模块,而不是当作测试文件。
写法二:用问号分隔的URL式参数(更规范)
mocha -r 'dotenv/config?dotenv_config_path=./env/dev-config.env' -r esm --recursive --exit
这种写法是Node.js加载模块时传递参数的标准方式,把参数作为模块路径的查询字符串,dotenv/config会自动解析这个参数。
2. 通过Mocha配置文件统一管理
如果你不想每次命令行都输入参数,可以把配置写到package.json的mocha配置里,或者单独的.mocharc.js文件中。比如修改package.json:
{ "name": "your-project", "mocha": { "diff": true, "extension": ["js"], "package": "./package.json", "reporter": "spec", "slow": 75, "timeout": 2000, "ui": "bdd", "recursive": true, "exit": true, "require": [ "esm", "dotenv/config?dotenv_config_path=./env/dev-config.env" ] } }
之后直接运行mocha命令即可,Mocha会自动读取配置并加载指定的.env文件。
3. 用环境变量指定路径
dotenv也支持通过环境变量DOTENV_CONFIG_PATH来指定文件路径,这样你可以先设置环境变量再运行Mocha:
Linux/macOS终端:
DOTENV_CONFIG_PATH=./env/dev-config.env mocha -r dotenv/config -r esm --recursive --exit
Windows CMD:
set DOTENV_CONFIG_PATH=./env/dev-config.env && mocha -r dotenv/config -r esm --recursive --exit
Windows PowerShell:
$env:DOTENV_CONFIG_PATH="./env/dev-config.env"; mocha -r dotenv/config -r esm --recursive --exit
验证方法
可以在测试代码中打印process.env的某个变量,比如你在dev-config.env里设置了NODE_ENV=development,在测试文件里加一行:
console.log('NODE_ENV:', process.env.NODE_ENV);
运行测试后如果输出NODE_ENV: development,就说明自定义.env文件加载成功了。
内容的提问来源于stack exchange,提问作者Ivan Bacher

