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 相关文章推荐
jQuery Jcrop插件实现图片选取功能
Nov 23 Javascript
jQuery学习笔记之2个小技巧
Jan 19 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
May 03 Javascript
node.js操作mysql(增删改查)
Jul 24 Javascript
基于javascript实现右下角浮动广告效果
Jan 08 Javascript
基于BootStrap环境写jQuery tabs插件
Jul 12 Javascript
Select2.js下拉框使用小结
Oct 24 Javascript
微信开发 js实现tabs选项卡效果
Oct 28 Javascript
关于js陀螺仪的理解分析
Apr 11 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
May 26 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
Sep 20 Javascript
vue使用refs获取嵌套组件中的值过程
Mar 31 Vue.js
关于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数组传递是值传递而非引用传递概念纠正
2013/01/31 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
2016/07/23 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
javascript中万恶的function实例分析
2011/05/25 Javascript
javascript中的startWith和endWith的几种实现方法
2013/05/07 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
jQuery实现页面滚动时智能浮动定位
2017/01/08 Javascript
javascript中BOM基础知识总结
2017/02/14 Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
vue axios 简单封装以及思考
2018/10/09 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
前端js中的事件循环eventloop机制详解
2019/05/15 Javascript
解决layer弹出层中表单不起作用的问题
2019/09/09 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
Pycharm学习教程(3) 代码运行调试
2017/05/03 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
python实现从ftp服务器下载文件
2020/03/03 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
领导班子四风表现材料
2014/08/23 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
销售员态度差检讨书
2014/10/26 职场文书
会议营销主持词
2015/07/03 职场文书
2016年小学教师政治学习心得体会
2016/01/23 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书
Nest.js参数校验和自定义返回数据格式详解
2021/03/29 Javascript
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js
python读取mat文件生成h5文件的实现
2022/07/15 Python