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技术实现的web小游戏(不含网游)
Jun 12 Javascript
网页中返回顶部代码(多种方法)另附注释说明
Apr 24 Javascript
js设置function参数默认值(适合没有传参情况)
Feb 24 Javascript
jquery制作漂亮的弹出层提示消息特效
Dec 23 Javascript
js如何改变文章的字体大小
Jan 08 Javascript
js 自带的 map() 方法全面了解
Aug 16 Javascript
Angularjs的Controller间通信机制实例分析
Nov 07 Javascript
AngularJS实现tab选项卡的方法详解
Jul 05 Javascript
JS简单实现数组去重的方法分析
Oct 14 Javascript
vue生命周期和react生命周期对比【推荐】
Sep 19 Javascript
微信小程序实现翻牌抽奖动画
Sep 21 Javascript
JS画布动态实现黑客帝国背景效果
Nov 08 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基于curl实现的股票信息查询类实例
2016/11/11 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
URL编码转换,escape() encodeURI() encodeURIComponent()
2006/12/27 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
js设置function参数默认值(适合没有传参情况)
2014/02/24 Javascript
快速使用Bootstrap搭建传送带
2016/05/06 Javascript
浅谈js图片前端预览之filereader和window.URL.createObjectURL
2016/06/30 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
JSON 数据详解及实例代码分析
2017/01/20 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
vue2.x select2 指令封装详解
2017/10/12 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
js的函数的按值传递参数(实例讲解)
2017/11/16 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
2020/11/23 Javascript
python的类方法和静态方法
2014/12/13 Python
Python Pandas 转换unix时间戳方式
2019/12/07 Python
CSS3中的弹性布局em运用入门详解 1em等于多少像素
2021/02/08 HTML / CSS
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
如何让IE9以下版本(ie6/7/8)认识html5元素
2013/04/01 HTML / CSS
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
生产总经理岗位职责
2013/12/19 职场文书
四川成都导游欢迎词
2014/01/18 职场文书
公司放假通知怎么写
2015/04/15 职场文书
小学英语课教学反思
2016/02/15 职场文书
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python