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学习随笔(使用window和frame)的技巧
Mar 08 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
Nov 30 Javascript
js通过元素class名字获取元素集合的具体实现
Jan 06 Javascript
浅谈javascript 函数内部属性
Jan 21 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
Aug 01 Javascript
浅谈JavaScript 覆盖原型以及更改原型
Aug 31 Javascript
js实现文字向上轮播功能
Jan 13 Javascript
vue-cli3.0使用及部分配置详解
Aug 29 Javascript
详谈js的变量提升以及使用方法
Oct 06 Javascript
JQuery中queue方法用法示例
Jan 31 jQuery
JS实现骰子3D旋转效果
Oct 24 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
怎样在UNIX系统下安装php3
2006/10/09 PHP
一个简单的php实现的MySQL数据浏览器
2007/03/11 PHP
一段实时更新的时间代码
2006/07/07 Javascript
JavaScript Timer实现代码
2010/02/17 Javascript
JavaScript类和继承 prototype属性
2010/09/03 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
javascript中html字符串转化为jquery dom对象的方法
2015/08/27 Javascript
常用javascript表单验证汇总
2020/07/20 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
JS实现图片平面旋转的方法
2016/03/01 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
最全面的百度地图JavaScript离线版开发
2016/09/10 Javascript
原生JavaScript制作计算器
2016/10/16 Javascript
详解Vue中过度动画效果应用
2017/05/25 Javascript
Javascript Promise用法详解
2018/05/10 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
利用python实现在微信群刷屏的方法
2019/02/21 Python
Django实现学员管理系统
2019/02/26 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
英国假发网站:Hothair
2018/02/23 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
Bonprix法国:时尚、鞋子、家居
2020/12/29 全球购物
总经理秘书工作职责
2013/12/26 职场文书
家长会学生演讲稿
2014/04/26 职场文书
大学生自荐书范文
2015/03/05 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
活动宣传稿范文
2015/07/23 职场文书
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫