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打开新窗口同时关闭旧窗口
Jan 16 Javascript
JavaScript包装对象使用介绍
Aug 29 Javascript
jQuery事件用法实例汇总
Aug 29 Javascript
JS实现方向键切换输入框焦点的方法
Aug 19 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
Feb 18 Javascript
vue.js2.0点击获取自己的属性和jquery方法
Feb 23 jQuery
微信小程序页面间传值与页面取值操作实例分析
Apr 30 Javascript
axios异步提交表单数据的几种方法
Aug 11 Javascript
解决layer图标icon不加载的问题
Sep 04 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
Oct 12 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
Apr 22 Javascript
js实现自动锁屏功能
Jun 02 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算开始时间到过期时间的相隔的天数
2011/01/12 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
php封装的page分页类完整实例
2016/10/18 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
使用canvas实现一个vue弹幕组件功能
2018/11/30 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
python下载文件时显示下载进度的方法
2015/04/02 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
python的concat等多种用法详解
2018/11/28 Python
Python OS模块实例详解
2019/04/15 Python
学python需要去培训机构吗
2020/07/01 Python
python使用建议技巧分享(三)
2020/08/18 Python
python实现经纬度采样的示例代码
2020/12/10 Python
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
计算机网络专业个人的自我评价
2013/10/17 职场文书
党的群众路线批评与自我批评发言稿
2014/10/16 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书