一、背景
项目中需要加入环境变量到进程中,例如数据库连接地址、ETCD数据等使用dotenv
,读取特定的配置文件进行数据的写入。代码如下:
import dotenv from 'dotenv';
dotenv.config({
path: './config/.env',
});
该代码在其他项目使用过,应该是可以跑通的
二、现象
项目启动的时候报错:dotenv.config({
^
TypeError: Cannot read properties of undefined (reading 'config')
at Object.<anonymous> (/Users/zhuchuanzhen/Documents/RMS/callback-feature/src/main.ts:2:8)
at Module._compile (node:internal/modules/cjs/loader:1358:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1416:10)
at Module.load (node:internal/modules/cjs/loader:1208:32)
at Module._load (node:internal/modules/cjs/loader:1024:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12)
at node:internal/main/run_main_module:28:49
Node.js v20.14.0
三、疑问地方
- 通过vscode的代码定义跳转,config函数确实在安装的三方模块中确实是有定义的
- 打印引入的该值:
console.log(dotenv)
,该变量确实为undefined
- 查看
dotenv
源码,该模块并没有使用export default
暴露出任何变量或者方法
那原来的项目是怎么可以使用的呢?
四、结论
关注一下 ts 配置文件 `tsconfig.json` 中的配置项:`esModuleInterop` 该配置项就是为了能够兼容ES模块与CommonJS模块的不同写法,使得引入方式能够变得统一要解决该问题,有下面两种方式
- 使用
import * as dotenv from 'dotenv'
- tscofnig.json中添加配置项:
"esModuleInterop": true,