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 相关文章推荐
xml分页+ajax请求数据源+dom取结果实例代码
Oct 31 Javascript
菜鸟学习JavaScript小实验之函数引用
Nov 17 Javascript
jquery getScript动态加载JS方法改进详解
Nov 15 Javascript
jQuery实现 注册时选择阅读条款 左右移动
Apr 11 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
Aug 26 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
Dec 02 Javascript
基于Bootstrap table组件实现多层表头的实例代码
Sep 07 Javascript
Angular使用Md5加密的解决方法
Sep 16 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
Aug 06 Javascript
解决vue 给window添加和移除resize事件遇到的坑
Jul 21 Javascript
ES2020让代码更优美的运算符 (?.) (??)
Jan 04 Javascript
vue实现锚点定位功能
Jun 29 Vue.js
关于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
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
PHP文件读写操作之文件读取方法详解
2011/01/13 PHP
PHP运行模式汇总
2016/11/06 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
srcElement表格样式
2006/09/03 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
JS Pro-深入面向对象的程序设计之继承的详解
2013/05/07 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
JavaScript判断用户是否对表单进行了修改的方法
2015/03/18 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
python openssl模块安装及用法
2020/12/06 Python
罗德与泰勒百货官网:Lord & Taylor
2016/08/12 全球购物
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
MySQL面试题目集锦
2016/04/14 面试题
行政助理求职自荐信
2013/10/26 职场文书
专科文秘应届生求职信
2013/11/18 职场文书
最新奶茶店创业计划书范文
2014/02/08 职场文书
作风建设剖析材料
2014/10/06 职场文书
辞职信怎么写
2015/02/27 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android