NestJS普通自定义函数中访问.env环境变量适配Heroku部署
普通函数读取多环境变量适配方案
你不需要为了读环境变量强行改造普通函数为类结构配合依赖注入,按以下步骤调整即可同时兼容本地开发读.env.development、Heroku部署读平台环境变量的需求:
- 第一步:在根模块
AppModule中全局配置ConfigModule,统一处理多环境的变量加载逻辑
// app.module.ts import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, // 开发环境读.env.development,其他环境读默认.env envFilePath: process.env.NODE_ENV === 'development' ? '.env.development' : '.env', // 生产环境(如Heroku部署)跳过本地env文件读取,直接使用系统注入的环境变量 ignoreEnvFile: process.env.NODE_ENV === 'production', }), // 项目原有其他模块引入保持不变 ], }) export class AppModule {}
- 第二步:修改
setup-app.ts,直接通过process.env读取COOKIE_KEY即可。ConfigModule加载完成后会把所有环境变量(本地文件配置、平台注入的变量)统一挂载到process.env对象上,普通函数无需依赖注入就能直接访问。
import { ValidationPipe } from '@nestjs/common'; const cookieSession = require('cookie-session'); export const setupApp = (app: any) => { app.use( cookieSession({ keys: [process.env.COOKIE_KEY], // 替换原硬编码值 }), ); app.useGlobalPipes( new ValidationPipe({ whitelist: true, }), ); };
- 第三步:确认
main.ts中的调用顺序,必须等Nest应用实例创建完成(此时ConfigModule已经执行完环境变量加载)后再调用setupApp,参考正确写法:
// main.ts import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { setupApp } from './setup-app'; async function bootstrap() { const app = await NestFactory.create(AppModule); setupApp(app); // 应用创建完成后再执行初始化配置 await app.listen(process.env.PORT || 3000); } bootstrap();
注意事项:记得将
.env、.env.development等本地环境配置文件加入.gitignore,避免敏感密钥泄露到代码仓库,生产环境的所有密钥统一在Heroku平台的环境变量配置页设置即可。
该方案无额外复杂配置,本地开发和Heroku部署场景下都能正确读取到对应COOKIE_KEY值,完全适配你当前使用普通函数做应用初始化的代码结构。
内容的提问来源于stack exchange,提问作者r00k13
相关产品推荐
相关产品推荐

