Nest.js环境变量配置与序列化详解
环境变量配置简述
程序在不同的环境下需要不同的环境变量,例如生产环境、测试环境以及开发环境所需要不同的数据库信息:链接地址、链接端口号、登录用户名和密码相关信息。为了解决这个问题需要进行相关操作。
在Nest中最佳方案创建一个ConfigModule,该ConfigModule公开一个ConfigService,在ConfigService加载特有环境的.env文件。Nest提供了@nestjs/config开箱即用的依赖包。
配置
npm生态有很多相关的依赖包,比如最简单的:
yarnadddotenv-flow yarnadd@types/dotenv-flow-D
安装好了直接在main.ts使用:
import*asdotenvfrom'dotenv-flow' /** *导入.env环境 *https://www.npmjs.com/package/dotenv-flow */ dotenv.config()
就可以使用对应的环境.env变量了,不过这样使用官方推荐软件包:@nestjs/config:
yarnadd@nestjs/config
在app.module.ts中的forRoot静态方法配置环境变量.env解析:
import{Module}from'@nestjs/common' import{ConfigModule}from'@nestjs/config' @Module({ imports:[ConfigModule.forRoot()] }) exportclassAppModule{}
然后在项目根目录下新建.env文件:
DATABASE_USER= DATABASE_PASSWORD= DATABASE_NAME= DATABASE_PORT= DATABASE_HOST=
自定义env路径
如果.env需要细化生产、测试和开发环境可以按照下面进行配置:
ConfigModule.forRoot({ envFilePath:['.env.development.local','.env.development'], })
其中排序越前面则优先级最高,但在启动命令中设置环境变量则是最高,例如:
exportDATABASE_USER=root&&neststart
自定义配置文件
对于复杂的项目,需要把用到的可配置变量需要收集起来,比如新建src/config/configuration.ts:
exportdefault()=>({ port:parseInt(process.env.PORT,10)||3000, database:{ host:process.env.DATABASE_HOST||'localhost', port:parseInt(process.env.DATABASE_PORT,10)||3306 } })
然后在ConfigModule.forRoot加载:
importconfigurationfrom'./config/configuration' @Module({ imports:[ ConfigModule.forRoot({ load:[configuration] }) ] }) exportclassAppModule{}
读取配置变量
如果需要读取相关的配置变量需要用到ConfigService,需要在用到的*.module.ts文件引入:
@Module({ imports:[ConfigModule], //... })
如果涉及的很多地方要写,每个module都要引入很烦人,可以在上面的app.module.ts
添加一个字段:
importconfigurationfrom'./config/configuration' @Module({ imports:[ ConfigModule.forRoot({ isGlobal:true, load:[configuration] }) ] }) exportclassAppModule{}
然后在构造函数注入使用:
import{ConfigService}from'@nestjs/config' constructor(privateconfigService:ConfigService){}
获取配置变量例如:
constdbUser=this.configService.get('DATABASE_USER') constdbHost=this.configService.get ('database.host')
序列化
序列化指的是程序在网络响应中返回对象发送之前的过程,将提供的信息要进行转换和清理才能发给客户端:比如查询某个用户,一般来说可以返回当前用户实体信息,但里面的密码信息是不可以发送给客户端的,所以这边要做一些转换。
还好Nest提供一个class-transformer相当好用的软件包:
yarnaddclass-transformer
比如在下列的用户实体信息排除密码信息:
import{Exclude}from'class-transformer' exportclassUserEntity{ id:number firstName:string; lastName:string; @Exclude() password:string; constructor(partial:Partial){ Object.assign(this,partial); } }
然后在控制器处理查询用户方法:
@UseInterceptors(ClassSerializerInterceptor) @Get(':id') findOne(@Param('id')id:string):Promise{ returnthis.userService.findOne(id) }
最终查询会忽略密码显示。
总结
到此这篇关于Nest.js环境变量配置与序列化的文章就介绍到这了,更多相关Nest.js环境变量配置内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。