nest.js 环境变量配置
前言
本地开发与正式环境有些配置是不一样的,比如:数据库的链接配置、环境标识NODE_ENV
等、以及一些静态的全局变量之类的数据;
nest主张的是模块化的形式,所以将这些东西全部包成一个模块注册使用是一个不错的办法,那么有什么便捷的处理方式呢?
nest官方提供了一个插件:@nestjs/config
用于处理这些东西,以及提供便捷的类型推断方式。
插件文档地址:使用文档
首先我们需要安装这个插件:
pnpm i @nestjs/config
环境变量区分
我们在项目中创建一个.env
的环境变量文件,这个文件只会在各自的本地存在,如果我们使用了git仓库来进行管理的话,这个文件是需要在.gitignore
中禁止上传的。
我们可以提供一个.env.example
文件来作为环境变量的示范文件,项目需要正式启动的时候,将.example
去掉,并将环境变量中具体的值改为正确的内容。
这样的话就可以方便的区分本地开发环境和线上开发环境,不需要将一些私密的数据上传了。
我们可以写入一些常用的数据:
NODE_ENV=development
配置完毕后我们继续往下走。
模块注册和使用
我们在app.module.ts
中注册这个插件:
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [ConfigModule.forRoot()],
})
export class AppModule {}
一般情况下我们的这个模块是需要给所有人使用的,那么就需要将其设置为全局模块。
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true, //设置为全局模块
})
],
})
export class AppModule {}
使用的时候我们可以在对应的服务里面注入:
import { Injectable} from "@nestjs/common";
@Injectable()
export class AppService {
constructor(private configService: ConfigService) {}
getHello(): string {
return this.configService.get("NODE_ENV"); //development
}
}
让我比较震惊的时它是怎么知道我注入的是这个模块的,emm,因为没有使用@Inject
包装器,让我有点惊叹,毕竟类包装器@Injectable
应该是拿不到具体的参数信息的啊?
这个以后明白了再细说吧!
注意:
get
方法是可以传入一个泛型的。
this.configService.get<string>("NODE_ENV");
get还有第二个参数,用于获取不到的默认值处理,当然泛型也存在第二个:
this.configService.get<string, string>("NODE_ENV","production");
自定义变量(命名空间)
有的时候我们会有一些全局的自定义变量需要共享,但是通过get
方法去获取的话是没有类型推断的,不会有ts属性提示这些,所以我们可以使用命名空间的方式来实现。
我们需要从模块中引入registerAs
函数,通过这个函数传入一个工厂函数返回自定义变量。
import { registerAs } from "@nestjs/config";
export default registerAs("app", () => ({
/** 端口 */
port: 3000,
}));
然后我们在模块中通过load
配置加载这个导出的函数。
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import appConfig from "./config/app";
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true, //设置为全局模块
load: [ appConfig ]
})
],
})
export class AppModule {}
然后在需要使用的地方通过Inject注入:
import { Injectable, Inject } from "@nestjs/common";
import { ConfigType } from "@nestjs/config";
import appConfig from "./config/app";
@Injectable()
export class AppService {
constructor(@Inject(appConfig.KEY) private config: ConfigType<typeof appConfig>) {}
getHello(): string {
return this.config.port;
}
}
配合ConfigType
来获取工厂函数返回值的类型定义。
事实上load不一定非得是registerAs
工厂函数,还可以是普通的函数返回对象的形式,具体可以去文档查看,但是这样的话就没法配合ConfigType
做类型推断了,所以看自己需要可以自行决定。
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
全部评论 8
alterass
Google Chrome Windows 10木灵鱼儿
FireFox Windows 10alterass
Google Chrome Windows 10木灵鱼儿
FireFox Windows 10alterass
Google Chrome Windows 10测试评论
Google Chrome Windows 10木灵鱼儿
FireFox Windows 10#" rel="external nofollow">测试xss
Google Chrome Windows 10