Nest.js环境变量配置与序列化详解


Posted in Javascript onFebruary 21, 2021

环境变量配置简述

程序在不同的环境下需要不同的环境变量,例如生产环境、测试环境以及开发环境所需要不同的数据库信息:链接地址、链接端口号、登录用户名和密码相关信息。为了解决这个问题需要进行相关操作。

在 Nest 中最佳方案创建一个 ConfigModule,该 ConfigModule 公开一个 ConfigService ,在 ConfigService 加载特有环境的 .env 文件。 Nest 提供了 @nestjs/config 开箱即用的依赖包。

配置

npm 生态有很多相关的依赖包,比如最简单的:

yarn add dotenv-flow
yarn add @types/dotenv-flow -D

安装好了直接在 main.ts 使用:

import * as dotenv from 'dotenv-flow'

/**
 * 导入 .env 环境
 * https://www.npmjs.com/package/dotenv-flow
 */
dotenv.config()

就可以使用对应的环境 .env 变量了,不过这样使用官方推荐软件包:@nestjs/config :

yarn add @nestjs/config

在 app.module.ts 中的 forRoot 静态方法配置环境变量 .env 解析:

import { Module } from '@nestjs/common'
import { ConfigModule } from '@nestjs/config'

@Module({
 imports: [ConfigModule.forRoot()]
})
export class AppModule {}

然后在项目根目录下新建 .env 文件:

DATABASE_USER=
DATABASE_PASSWORD=
DATABASE_NAME=
DATABASE_PORT=
DATABASE_HOST=

自定义 env 路径

如果 .env 需要细化生产、测试和开发环境可以按照下面进行配置:

ConfigModule.forRoot({
 envFilePath: ['.env.development.local', '.env.development'],
})

其中排序越前面则优先级最高,但在启动命令中设置环境变量则是最高,例如:

export DATABASE_USER=root && nest start

自定义配置文件

对于复杂的项目,需要把用到的可配置变量需要收集起来,比如新建 src/config/configuration.ts :

export default () => ({
 port: parseInt(process.env.PORT, 10) || 3000,
 database: {
  host: process.env.DATABASE_HOST || 'localhost',
  port: parseInt(process.env.DATABASE_PORT, 10) || 3306
 }
})

然后在 ConfigModule.forRoot 加载:

import configuration from './config/configuration'

@Module({
 imports: [
  ConfigModule.forRoot({
   load: [configuration]
  })
 ]
})
export class AppModule {}

读取配置变量

如果需要读取相关的配置变量需要用到 ConfigService ,需要在用到的 *.module.ts 文件引入:

@Module({
 imports: [ConfigModule],
 // ...
})

如果涉及的很多地方要写,每个 module 都要引入很烦人,可以在上面的 app.module.ts

添加一个字段:

import configuration from './config/configuration'

@Module({
 imports: [
  ConfigModule.forRoot({
   isGlobal: true,
   load: [configuration]
  })
 ]
})
export class AppModule {}

然后在构造函数注入使用:

import { ConfigService } from '@nestjs/config'

constructor(private configService: ConfigService) {}

获取配置变量例如:

const dbUser = this.configService.get<string>('DATABASE_USER')
const dbHost = this.configService.get<string>('database.host')

序列化

序列化指的是程序在网络响应中返回对象发送之前的过程,将提供的信息要进行转换和清理才能发给客户端:比如查询某个用户,一般来说可以返回当前用户实体信息,但里面的密码信息是不可以发送给客户端的,所以这边要做一些转换。

还好 Nest 提供一个 class-transformer 相当好用的软件包:

yarn add class-transformer

比如在下列的用户实体信息排除密码信息:

import { Exclude } from 'class-transformer'

export class UserEntity {
 id: number
 firstName: string;
 lastName: string;

 @Exclude()
 password: string;

 constructor(partial: Partial<UserEntity>) {
  Object.assign(this, partial);
 }
}

然后在控制器处理查询用户方法:

@UseInterceptors(ClassSerializerInterceptor)
@Get(':id')
findOne(@Param('id') id: string): Promise<UserEntity> {
 return this.userService.findOne(id)
}

最终查询会忽略密码显示。

总结

到此这篇关于Nest.js环境变量配置与序列化的文章就介绍到这了,更多相关Nest.js环境变量配置内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript 日历提醒系统( 兼容所有浏览器 )
Apr 07 Javascript
jQuery Selector选择器小结
May 06 Javascript
在js文件中如何获取basePath处理js路径问题
Jul 10 Javascript
JS版元素周期表实现方法
Aug 05 Javascript
详解jquery事件delegate()的使用方法
Jan 25 Javascript
基于Javascript实现返回顶部按钮
Feb 29 Javascript
利用jQuery解析获取JSON数据
Apr 08 jQuery
js实现canvas保存图片为png格式并下载到本地的方法
Aug 31 Javascript
基于jquery实现五星好评
Nov 18 jQuery
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
Jan 26 Javascript
jQuery.extend 与 jQuery.fn.extend的用法及区别实例分析
Jul 25 jQuery
js数组去重的方法总结
Jan 18 Javascript
关于Js中new操作符的作用详解
Feb 21 #Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
Feb 20 #Vue.js
Vue实现todo应用的示例
Feb 20 #Vue.js
JavaScript 绘制饼图的示例
Feb 19 #Javascript
JavaScript 判断浏览器是否是IE
Feb 19 #Javascript
原生JavaScript实现进度条
Feb 19 #Javascript
原生JavaScript实现换肤
Feb 19 #Javascript
You might like
php 上传功能实例代码
2010/04/13 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
php打印输出棋盘的实现方法
2014/12/23 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
jQuery 标题的自动翻转实现代码
2009/10/14 Javascript
为指定元素增加样式的js代码
2009/12/09 Javascript
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
2016/01/27 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
js友好的时间返回函数
2016/08/24 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
2019/12/23 jQuery
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
[01:04:05]VG vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python 随机生成中文验证码的实例代码
2013/03/20 Python
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
Python 调用Java实例详解
2017/06/02 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
Django rest framework实现分页的示例
2018/05/24 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
python判断自身是否正在运行的方法
2019/08/08 Python
详解anaconda安装步骤
2020/11/23 Python
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
《祁黄羊》教学反思
2014/04/22 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
七一建党节慰问信
2015/02/14 职场文书
退休欢送会主持词
2015/07/01 职场文书
GPU服务器的多用户配置方法
2022/07/07 Servers