You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:54:16