环境加载
前俩篇讲解了快速入门nest,接下来大致介绍一下nest项目如何进行改造;
项目中一般都会用到中间件,拦截器,参数管道校验等等,接下来分多个方向大致介绍这些如何在项目中使用;
项目改造
类似于vue项目,有一些成熟的方案去管理你的项目,提交规范,代码风格,代码规范,环境变量等等;改造的范围大致分为以下几点:
- 不同的环境变量,设置对应不同的值
- 设置跨域已经增强
http工具,设置全局的访问前缀; swagger文档生产文档,不再需要自己编写具体的文档说明;中间件,拦截器,定时任务等等;
加载不同的环境文件
这里有俩种的方案可以实现,dotenv和@nestjs/config
首先需要设置环境,根据变量区分是开发环境还是生产环境;
pnpm add -D cross-env安装cross-env,然后再package.json中找到scripts, 修改start启动命令:
json
{
"scripts": {
"start": "cross-env NODE_ENV=development nest start",
"start:dev": "cross-env NODE_ENV=development nest start --watch",
"start:debug": "cross-env NODE_ENV=development nest start --debug --watch"
}
}
dotenv
在项目根目录添加.env.development和.env.production;
在main.ts中添加如下:
ts
import * as dotenv from "dotenv";
const { NODE_ENV } = process.env;
const envFile = `.env${NODE_ENV ? `.${NODE_ENV}` : ".production"}`;
dotenv.config({ path: envFile });
这样就可以使用process.env.XXXX了
@nestjs/config
如果使用这种方案,那么就需要引入pnpm add @nestjs/config
ts
import { ConfigModule } from "@nestjs/config";
@Module({
imports: [
// 加载环境配置文件
ConfigModule.forRoot({
isGlobal: true,
envFilePath:
process.env.NODE_ENV === 'development'
? '.env.development'
: '.env.production',
}),
]
})
在 app.module.ts 中注册后,可在任意 Service 中注入 ConfigService:
ts
import { ConfigService } from "@nestjs/config";
@Injectable()
export class AppService {
constructor(private config: ConfigService) {}
getPort() {
return this.config.get<number>("PORT", 3000);
}
}
生产环境建议通过 ConfigModule.forRoot({ envFilePath: [".env", ".env.production"] }) 或 registerAsync 从密钥管理服务加载,勿将密钥提交到仓库。详见 new/config。
参考文献
| 资料 | 说明 |
|---|---|
| Configuration | @nestjs/config 官方 |
| 工程化 · 环境变量 | .env 约定 |