You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Node.js+TypeScript中dotenv读取.env变量显示undefined的问题排查

问题排查与解决方案

首先,你的process.env.SERVER_PORT返回undefined,大概率是dotenv没有正确加载到你的.env文件,或者加载时机不对,下面逐一分析并给出解决办法:

1. 检查.env文件位置与dotenv加载路径

dotenv默认会从项目根目录(也就是和package.json同级的目录)加载.env文件。如果你的app.ts是放在src文件夹下的,直接调用dotenv.config()会找不到上层目录的.env,导致环境变量没被注入。

修复方法:

指定.env文件的绝对路径,借助path模块定位:

// 在app.ts顶部修改dotenv的调用
import path from 'path';
import * as dotenv from 'dotenv';

// 确保这行在所有使用process.env的代码之前
dotenv.config({ path: path.resolve(__dirname, '../.env') });

这里__dirname是当前app.ts编译后的文件目录(比如dist),../会回到项目根目录,从而找到.env

2. 确保dotenv在所有依赖环境变量的代码之前加载

看你的代码里,import configuration from './config/index';这一行是在dotenv.config()之前执行的(ES模块的import是静态解析,会优先于所有代码执行)。如果configuration文件里用到了process.env的变量,那这些变量会是undefined;即便你这里直接用process.env.SERVER_PORT,也建议把dotenv.config()放在最早执行的代码位置

优化建议:

如果你的项目里有多个文件依赖环境变量,可以在启动时通过Node参数强制加载dotenv,这样就不用在每个文件里重复写dotenv.config()
修改package.json的启动脚本:

"scripts": {
  "start": "node -r dotenv/config dist/app.js",
  "dev": "ts-node -r dotenv/config src/app.ts"
}

-r dotenv/config会在执行你的代码前先加载dotenv并注入环境变量,这样更稳妥。

3. TypeScript环境变量类型提示(可选但推荐)

TypeScript默认不知道你自定义的环境变量,所以会有类型警告。可以在src目录下创建env.d.ts文件,添加类型定义:

declare global {
  namespace NodeJS {
    interface ProcessEnv {
      SERVER_PORT: string;
      DATABASE_URL: string;
    }
  }
}

export {};

这样在使用process.env.SERVER_PORT时就会有正确的类型提示,也能避免编译警告。

验证方法

dotenv.config()之后加一行打印,确认是否加载成功:

dotenv.config({ path: path.resolve(__dirname, '../.env') });
console.log('Loaded env variables:', process.env); // 看看输出里有没有SERVER_PORT

额外注意点

  • .env文件不要提交到Git,记得在.gitignore里加上.env
  • 环境变量的值不要加多余的引号,比如你的SERVER_PORT=3000是对的,DATABASE_URL='mongodb://...'里的单引号可以去掉,dotenv会自动解析

内容的提问来源于stack exchange,提问作者kianoush dortaj

火山引擎 最新活动