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 相关文章推荐
对google个性主页的拖拽效果的js的完整注释[转]
Apr 10 Javascript
JS操作Cookies包括(读取添加与删除)
Dec 26 Javascript
Angularjs实现多个页面共享数据的方式
Mar 29 Javascript
JS JSOP跨域请求实例详解
Jul 04 Javascript
jQuery实现立体式数字动态增加(animate方法)
Dec 21 Javascript
实现div内部滚动条滚动到底部和顶部的代码
Nov 15 Javascript
Angular中支持SCSS的方法
Nov 18 Javascript
详解Vue2.0组件的继承与扩展
Nov 23 Javascript
使vue实现jQuery调用的两种方法
May 12 jQuery
微信小程序实现树莓派(raspberry pi)小车控制
Feb 12 Javascript
vue组件是如何解析及渲染的?
Jan 13 Vue.js
Javascript设计模式之原型模式详细
Oct 05 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
操作Oracle的php类
2006/10/09 PHP
PHP实现定时生成HTML网站首页实例代码
2008/11/20 PHP
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
详解YII关联查询
2016/01/10 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
jquery自定义下拉列表示例
2014/04/25 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
学习JavaScript设计模式(单例模式)
2015/11/26 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
Bootstrap布局方式详解
2016/05/27 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
PHP7新特性简述
2017/06/11 Javascript
JS随机排序数组实现方法分析
2017/10/11 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
应届生污水处理求职信
2013/11/06 职场文书
班班通项目实施方案
2014/02/25 职场文书
关于保护环境的标语
2014/06/09 职场文书
幼儿园老师新年寄语2015
2014/12/08 职场文书
中英文求职信范文
2015/03/19 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
承诺书怎么写 ?
2019/04/16 职场文书
导游词之任弼时故居
2020/01/07 职场文书
详解Java实践之抽象工厂模式
2021/06/18 Java/Android