概述
链接:upgrade
相关文章列表
- nestjs系列笔记
示例工程说明
- 这个工程是我使用nestjs多个项目后,总结出来的模板。
- 这是一个完整的工程,使用了yaml做为配置,使用了log4js和redis和typeorm,sawgger,自定义了session store等,支持多环境配置等。
- 这里使用tmg使用成typeorm实体类(npm i @zdhsoft/tmg -g)
- 还有我喜欢使用我自己的开源库xmcommon( npm i xmcommon),这里有很多常用的方法,我在工程中经常用到。
- 下面是说明
- 为什么只给一个链接,因为my_testlist是我编写文章和学习,实验性代码的仓库,同时可以通过它获得jet brains每年许可的项目, 很多积累代码,在我需要的时候,可以随时看。
A progressive Node.js framework for building efficient and scalable server-side applications.
项目:upgrade
- 作者:zdhsoft
- 日期:2023-04-27
- 基于nestjs的后端系统
- License:
1. Description
1.1 开发环境说明
- 这个工程默认使用vscode, 并已经集成了vscode运行所需要必要配置
- 这里使用eslint对代码进行检查 具体配置查看 .eslintrc.js 使用npm run lint对代码做整检查
- 这里使用prettier对代码进行格式化,具体配置看 .prettierrc 使用npm run format可以对整个项目代码格式化
- 这里需要这装插件:ESLint, 和 Prettier - Code formatter
- .gitigonore 这里配置了一些,可以忽略的文件,使他们不会进入git管理
1.2 配置
- 这里工程已经支持多环境配置,每个环境使用指定的配置。配置文件全在config目录下面
- 这里使用的配置是yaml格式的文件,文件名格式:env.环境名称.yaml,其中,env.default.yaml是一个全局的默认配置,实际环境的配置会替换env.default.yaml存在的配置
- 配置处理的代码,放在src/init/init.ts文件,在main.ts最开的包含中,要第一个引入这个模块
// main.ts
import './init/init'; //在main.ts最上面,要引入这个模块
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { getLogger } from 'xmcommon';
import { NestLogger } from './common/nest.logger';
import { RequestInterceptor } from './common/request.interceptor';
import { HttpFilterFilter } from './common/http_filter.filter';
import { NestExpressApplication } from '@nestjs/platform-express';
import * as session from 'express-session';
import * as path from 'path';
import { AuthGuard } from './common/auth.guard';
import { EnvUtils } from './env_utils';
import { ConfigUtils } from './init/config_utils';
import { ValidationPipe } from './common/validation_pipe';
- src/init/init.ts 首先会初会化全局的日志文件,然后初始化环境变量,最后加载对应的环境的配置文件
- 程序启动会,会在config/final生成最终的配置文件,分别是finalConfig.环境名称.json和finalConfig.环境名称.yaml
1.3 已经集成的模块功能
1.3.1 session
- 这里已经集成了session,支持基于内存,文件,redis和mysql四种存放session的方式。(在实际测试使用中,发现使用文件存储的,老是会存在一些问题)
- 详见src/init/config_utils.ts中的buildSessionOptions
1.3.2 log4js
- 这里已经集成了log4js生成日志,有三个输出分别是console,日志文件和错误日志文件
1.3.3 这里集成了全局的守护的功能:auth.guards.ts
- 这个会对api做登录检查,有需要登录的,如果没有登录,返回没有登录的错误
1.3.4 全局的验证管道: validation_pipe.ts
- 这个主要是针对class-validator和class-transformer的依赖参数注入,这方面的资料比较多,可以看官方文档
1.3.5 全局的异常处理 http_filter.filter.ts
- 这个主要是将抛出的异常获取,并转换为通用的返回方式
1.3.6 全局的返回处理 这块代码在全局的拦截器里面 request.interceptor.ts
- nestjs没有默认的固定返回结构,可以返回任何内容。这里专门针对api的调用,做统一返回处理
1.3.7 全局的拦截器 request.interceptor.ts
- 这里主要的是处理POST 201的返回,将它变成为200,
- 增加请求处理前后的日志打印和耗时打印,用于调试
1.3.7 集成swagger
- 在开发模式下,集成了 http://xxxx/apidoc方式访问
1.4 运行环境说明(envid)
1.4.1 运行环境与配置
- 一般情况下,运行环境主要有两个,一个是测试运行环境,一个是生产运行环境,不同的环境要加载不同的配置
- 在这里启动的时候,需要指明envid,告诉系统这次运行的是什么环境。
- 通过个envid可以加载config/env.xxx.ymal的配置文件
- 如envid=‘test’,则会加载config/env.test.yaml
- 默认的envid是’local’,除此之外,还有一个缺省环境,对一些所有环境公有的配置,可以放到env.default.yaml中, 这样可以减少配置量。在实际的环境如果有同名的,则实际的配置会替换在default中的配置。
- 如果程序启动,需要指定环境id,则只要传入参数就可以,如下启动’test’环境。
node dist/main.js --envid test
1.4.2 增加自定义环境说明
- 默认的工程,提供了四个默认环境与配置,分别是,default, test, local, production,这些环境都定义在EnumRuntimeEnv这个枚举中
- 枚举等运行环境相关配置放在文件,src/env_utils.ts中
/** 可以环境常量定义 */
export enum EnumRuntimeEnv {
/** 缺省配置环境 */
default = 'default',
/** 测试 */
test = 'test',
/** 本地调试环境 */
local = 'local',
/** 生产环境 */
production = 'production',
}
- 如果要新增加运行环境,第一步先在EnumRuntimeEnv增加新的枚举值,第二步,在config/增加一个新的配置文件。下示是示例增加一个simple环境
// 第一步: 在EnumRuntimeEnv增加simple枚举值的定义,要求名称与值相同
export enum EnumRuntimeEnv {
/** 缺省配置环境 */
default = 'default',
/** 测试 */
test = 'test',
/** 本地调试环境 */
local = 'local',
/** 生产环境 */
production = 'production',
/** 新增加的环境 */
simple = 'simple',
}
// 第二步:在config目录下,复制env.default.yaml,并改名为env.simple.yaml,
// 第三步:再用编辑器编译env.simple.yaml文件,配置simple实际需要的配置
// 第四步:启动的时候,带上启动参数: node dist/main.js --envid simple
// 这样就实现了新增环境要求
- 如果有些环境,是要视步生产环境的,则只需要将EenumRuntimeEnv.simple加到生产环境id列表中去就可以了,在src/env_utils.ts中有一个生产环境id数组:production_env_list。如下增加
/** 被视为生产环境的环境id数组 */
const production_env_list = [EnumRuntimeEnv.production, EnumRuntimeEnv.simple];
// 系统启动后,就可以看到取得当前系统环境定义
/** 全局环境配置 */
const env: IEnv = {
env: EnumRuntimeEnv.local,
/** 是否是开发环境 */
isDev: true,
};
// 使用的时候,在代码调用
if(XEnvUtils.isDev) {
console.log('这是一个开发环境');
} else {
console.log('这是一个生产环境');
}
2 安装依赖环境
$ npm install
3 运行app
3.1 在vscode下面
- 这个模板工程已经配置好了相应的vscode配置,可以在vscode下面,按F5开始调试运行
- 下面是配置的内容.
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "pwa-node",
"request": "launch",
"name": "编译并运行 - 本地测试",
"console": "integratedTerminal",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}\\dist\\main.js",
"preLaunchTask": "npmBuild",
"args": ["--env", "test"],
"outFiles": [
"${workspaceFolder}/dist/**/*.js"
]
},
{
"type": "pwa-node",
"request": "launch",
"name": "直接运行,不编译 - 本地测试",
"console": "integratedTerminal",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}\\dist\\main.js",
"args": ["--env", "test"],
"outFiles": [
"${workspaceFolder}/dist/**/*.js"
]
}
]
}
3.1.1 编译并运行 - 本地测试
这个是针对已有变动代码了,则需要在这里运行,这里会对代码做检查,并且编译,最后才是运行
3.1.2 直接运行,不编译 - 本地测试
这个是没有变动代码,可以直接开始调试运行
3.2 命令行
# development
$ npm run start
# watch mode
$ npm run start:dev
# production mode
$ npm run start:prod
4 Test
# unit tests
$ npm run test
# e2e tests
$ npm run test:e2e
# test coverage
$ npm run test:cov
5 Support
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you’d like to join them, please read more here.
6 Stay in touch
- Author - Kamil Myśliwiec
- Website - https://nestjs.com
- Twitter - @nestframework