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 相关文章推荐
jQuery toggleClass应用实例(附效果图)
Apr 06 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
May 11 Javascript
jQuery动画特效实例教程
Aug 29 Javascript
jQuery Ajax使用实例
Apr 16 Javascript
javascript 动态脚本添加的简单方法
Oct 11 Javascript
webpack配置的最佳实践分享
Apr 21 Javascript
JavaScript使用readAsDataURL读取图像文件
May 10 Javascript
VUE axios发送跨域请求需要注意的问题
Jul 06 Javascript
Angular 项目实现国际化的方法
Jan 08 Javascript
vue 中filter的多种用法
Apr 26 Javascript
JS实现多功能计算器
Oct 28 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
Nov 04 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中看实例学正则表达式
2006/12/25 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
怎样使用php与jquery设置和读取cookies
2013/08/08 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
PHP中strpos、strstr和stripos、stristr函数分析
2016/06/11 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
javascript  删除select中的所有option的实例
2017/09/17 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
[48:48]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Dream TIME
2014/05/21 DOTA
python中定义结构体的方法
2013/03/04 Python
python批量提取word内信息
2015/08/09 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
python生成随机图形验证码详解
2017/11/08 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
Python 存储字符串时节省空间的方法
2019/04/23 Python
如何使用Python 打印各种三角形
2019/06/28 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
2020/07/03 Python
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
linux面试题参考答案(4)
2014/09/21 面试题
高校辅导员推荐信范文
2013/12/25 职场文书
应届毕业生通用的自荐书范文
2014/02/07 职场文书
气象学专业个人求职信
2014/03/15 职场文书
投资意向书范本
2014/04/01 职场文书
我的理想演讲稿
2014/04/30 职场文书
学生安全责任书范本
2014/07/24 职场文书
初二英语教学反思
2016/02/15 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书
Nginx配置Https安全认证的实现
2021/05/26 Servers
Redis可视化客户端小结
2021/06/10 Redis