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解析HTML、JSON和XML实例详解
Mar 29 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
Feb 03 Javascript
javascript实现仿IE顶部的可关闭警告条
May 05 Javascript
javascript转换静态图片,增加粒子动画效果
May 28 Javascript
jQuery实现列表内容的动态载入特效
Aug 08 Javascript
干货分享:让你分分钟学会javascript闭包
Dec 25 Javascript
深入理解jquery中的事件与动画
May 24 Javascript
Node.js Streams文件读写操作详解
Jul 04 Javascript
Express URL跳转(重定向)的实现方法
Apr 07 Javascript
prototype.js简单实现ajax功能示例
Oct 18 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
Nov 03 Javascript
js观察者模式的弹幕案例
Nov 23 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数组函数序列之array_intersect() 返回两个或多个数组的交集数组
2011/11/10 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
php检测文件编码的方法示例
2014/04/25 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
PHP基于新浪IP库获取IP详细地址的方法
2017/05/04 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
基于Vuejs框架实现翻页组件
2020/06/29 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
jquery编写日期选择器
2017/03/16 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
2019/02/21 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
2019/12/12 Javascript
JavaScript中的this妙用实例分析
2020/05/09 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
vue实现列表拖拽排序的功能
2020/11/02 Javascript
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
关于python字符串方法分类详解
2019/08/20 Python
python Scrapy框架原理解析
2021/01/04 Python
欢迎横幅标语
2014/06/17 职场文书
产品委托授权书范本
2014/09/16 职场文书
本溪水洞导游词
2015/02/11 职场文书
大学运动会通讯稿
2015/07/18 职场文书
2015中学学校工作总结
2015/07/20 职场文书
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL