Node.js配置多环境.env文件时报ERR_INVALID_ARG_TYPE错误如何解决
错误根因
__dirname是CommonJS规范下的全局变量,不属于path模块的内置属性,代码中path.__dirname的写法本身错误,取值为undefined- 代码使用
import语法属于ES Module(ESM)模式,该模式下默认没有全局__dirname、__filename变量,直接调用也会返回undefined - 两个错误叠加导致
path.resolve方法接收的第一个入参为undefined,不符合入参必须为字符串的要求,触发类型错误
修复方案
步骤1:构造ESM环境下的目录路径
通过import.meta.url搭配url模块的fileURLToPath方法,生成等价于CommonJS下的__dirname路径。
步骤2:修正代码错误逻辑
调整dotenv的path参数写法,同时修正变量声明的语法错误。
(可选)适配Windows环境变量设置
Windows原生的环境变量设置命令跨平台兼容性差,建议安装cross-env实现多平台统一的环境变量注入。
修复后完整代码
import dotenv from "dotenv"; import path from 'path'; import { fileURLToPath } from 'url'; // 生成ESM模式下的当前文件路径、当前目录路径 const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); dotenv.config({ // 兜底默认加载development.env,避免NODE_ENV未传入时报错 path: path.resolve(__dirname, `${process.env.NODE_ENV || 'development'}.env`), }); const config = { NODE_ENV: process.env.NODE_ENV || "development", HOST: process.env.HOST || "localhost", PORT: process.env.PORT || 3001, }; export default config;
额外注意事项
- Node.js 14.13.0及以上版本原生支持
fileURLToPath与ESM模式,无需额外安装依赖 - Windows环境下启动项目时,可安装
cross-env后使用cross-env NODE_ENV=production node 入口文件.js的命令启动,避免环境变量读取异常
内容的提问来源于stack exchange,提问作者Umut Palabiyik
相关产品推荐
相关产品推荐

