dotenv模块引入失败

一、背景

项目中需要加入环境变量到进程中,例如数据库连接地址、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模块的不同写法,使得引入方式能够变得统一

要解决该问题,有下面两种方式

  1. 使用import * as dotenv from 'dotenv'
  2. tscofnig.json中添加配置项:"esModuleInterop": true,
posted @ 2024-09-10 16:02  Mr_Kahn  阅读(167)  评论(0)    收藏  举报