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 相关文章推荐
js 分栏效果实现代码
Aug 29 Javascript
javascript验证上传文件的类型限制必须为某些格式
Nov 14 Javascript
jQuery Form 页面表单提交的小例子
Nov 15 Javascript
分享JS数组求和与求最大值的方法
Aug 11 Javascript
JavaScript数据结构链表知识详解
Nov 21 Javascript
Angular动态添加、删除输入框并计算值实例代码
Mar 29 Javascript
关于jQuery库冲突的完美解决办法
May 20 jQuery
微信小程序自定义组件实现环形进度条
Nov 17 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
Jul 19 Javascript
在vue中动态添加class类进行显示隐藏实例
Nov 09 Javascript
Vue实现页面添加水印功能
Nov 09 Javascript
JavaScript Dom实现轮播图原理和实例
Feb 19 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实现获取某个月份周次信息的方法
2015/08/11 PHP
php创建无限级树型菜单
2015/11/05 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
Javascript 篱式条件判断
2008/08/22 Javascript
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
jQuery Tools tooltip使用说明
2012/07/14 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
BootStrap实用代码片段之一
2016/03/22 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
[17:45]DOTA2 HEROES教学视频教你分分钟做大人-军团指挥官
2014/06/11 DOTA
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
python client使用http post 到server端的代码
2013/02/10 Python
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
Python 制作糗事百科爬虫实例
2016/09/22 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
2017/08/05 Python
python实现mysql的读写分离及负载均衡
2018/02/04 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
印度网上药店:1mg
2017/10/13 全球购物
美国豪华的多品牌精品店:The Webster
2019/07/31 全球购物
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
中专生学习生活的自我评价分享
2013/10/27 职场文书
绿色环保口号
2014/06/12 职场文书
驾驶员安全责任书
2014/07/22 职场文书
机电一体化专业求职信
2014/07/22 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
V Rising 服务器搭建图文教程
2022/06/16 Servers