nest笔记十一:一个完整的nestjs示例工程(nestjs_template)

概述

链接:nestjs_template

相关文章列表

  • nestjs系列笔记

示例工程说明

  • 这个工程是我使用nestjs多个项目后,总结出来的模板。
  • 这是一个完整的工程,使用了yaml做为配置,使用了log4js和redis和typeorm,sawgger,自定义了session store等,支持多环境配置等。
  • 这里使用tmg使用成typeorm实体类(npm i @zdhsoft/tmg -g)
  • 还有我喜欢使用我自己的开源库xmcommon( npm i xmcommon),这里有很多常用的方法,我在工程中经常用到。
  • 下面是说明

Nest Logo

A progressive Node.js framework for building efficient and scalable server-side applications.

NPM Version Package License NPM Downloads CircleCI Coverage Discord Backers on Open Collective Sponsors on Open Collective Support us

项目:nestjs_template

  • 作者:zdhsoft
  • 日期:2023-05-19
  • 基于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/21528.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch 集群部署插件管理及副本分片概念介绍

Elasticsearch 集群配置版本均为8以上 安装前准备 CPU 2C 内存4G或更多 操作系统: Ubuntu20.04,Ubuntu18.04,Rocky8.X,Centos 7.X 操作系统盘50G 主机名设置规则为nodeX.qingtong.org 生产环境建议准备单独的数据磁盘主机名 #各自服务器配置自己的主机名 hostnamectl set-ho…

STM32实现基于RS485的简单的Modbus协议

背景 我这里用STM32实现&#xff0c;其实可以搬移到其他MCU&#xff0c;之前有项目使用STM32实现Modbus协议 这个场景比较正常&#xff0c;很多时候都能碰到 这里主要是Modbus和变频器通信 最常见的是使用Modbus实现传感器数据的采集&#xff0c;我记得之前用过一些传感器都…

学习RHCSA的day.03

目录 2.6 Linux系统的目录结构 2.7 目录操作命令 2.8 文件操作命令 2.6 Linux系统的目录结构 1、Linux目录结构的特点 分区加载于目录结构&#xff1a; 使用树形目录结构来组织和管理文件。整个系统只有一个位于根分区的一个根目录&#xff08;树根&#xff09;、一棵树。…

盘点 | 10大类企业管理系统有哪些

人类的发展史也是一部工具的进化史&#xff0c;企业管理手段同样不例外。移动互联网时代给了传统低下的手工操作方式致命一击&#xff0c;应运而生的各类企业管理系统工具为企业管理插上腾飞的翅膀&#xff0c;彻底颠覆了手动低效率的历史&#xff0c;变得更加移动化、智能化。…

求最小生成树(Prim算法与Kruskal算法与并查集)

目录 1、案例要求2、算法设计与实现2.1 Prim算法2.1.1 构造无向图2.1.2 编写Prim算法函数2.1.3 实现代码2.1.4 运行结果截图 2.2 Kruskal算法2.2.1 构造无向图2.2.2 编写并查集UnionFind类2.2.3 编写Kruskal算法2.2.4 实现代码2.2.5 运行结果截图 3、总结 1、案例要求 利用贪心…

低代码与其拓荒,不如颠覆开发行业

目录 一、前言 二、低代码是一个值得信赖的“黑盒子” 粗略总结&#xff0c;开发者对低代码平台所见即所得设计器有两种反应&#xff1a; 三、人人都爱黑盒子 四、用“低代码平台”来开发是什么样的感受&#xff1f; 五、结论 一、前言 在科幻电影中&#xff0c;我们看到…

【OpenCV】C++红绿灯轮廓识别+ROS话题实现

目录 前言 一、背景知识 Opencv轮廓检测 ROS相关知识 二、环境依赖 三、具体实现 Step1&#xff1a;初始化ROS&#xff0c;订阅话题 Step2&#xff1a;接收话题&#xff0c;进入回调 1. 帧处理 2. 膨胀腐蚀处理 Step3&#xff1a;红绿特征处理 1. 提取绘制轮廓 2…

【网络协议详解】——数据链路层协议(学习笔记)

&#x1f4d6; 前言&#xff1a;数据链路层是 OSI 模型中的第二层&#xff0c;位于物理层之上&#xff0c;是通信网络中的重要组成部分之一。数据链路层协议负责将网络层传输的数据分组封装成帧&#xff0c;传输到物理层&#xff0c;并通过物理介质进行传输。同时&#xff0c;数…

算法笔记:A2-A4-RSRQ切换算法

1 LTE 切换 LTE切换是移动通信网络中的一个过程&#xff0c;移动设备在保持无间断服务的情况下&#xff0c;将其连接从一个基站切换到另一个基站。当移动设备离开当前基站的覆盖范围或网络资源拥塞时&#xff0c;就需要进行切换。LTE切换通常是基于特定的条件触发的&#xff0…

makefile 学习(1):C/C++ 编译过程

1. GCC 介绍 1.1 介绍 GCC 官方文档 https://gcc.gnu.org/onlinedocs/ 官方文档是最权威的&#xff0c;网上所有的答案都来自官方文档国内论坛参差不齐&#xff0c;找到好的答案比较花时间&#xff0c;并且很容易被错误的文档误导。所以推荐看官方文档靠谱点&#xff0c;并且…

二、数据字典开发

文章目录 二、数据字典开发1、搭建service-cmn模块1.1 搭建service-cmn模块1.2 修改配置1.3 启动类 2、数据字典列表2.1 数据字典列表接口2.1.1 model模块添加数据字典实体2.1.2 添加数据字典mapper2.1.4 添加数据字典controller 2.2 数据字典列表前端2.2.1 添加路由2.2.2 定义…

【Java算法题】剑指offer_01数据结构

前言 刷题链接&#xff1a; https://www.nowcoder.com/exam/oj/ta?page2&tpId13&type265 1. 链表 JZ24 反转链表 思路&#xff1a;基本操作&#xff0c;如下所示。 /* public class ListNode {int val;ListNode next null;ListNode(int val) {this.val val;} }…

ad18学习笔记一

如何自学altium designer如何自学altium designer&#xff1f; - 知乎如何自学altium designer 这里面有ad官方推荐的b站的视频&#xff1a;可以直接去b站关注ad官方账号 AltiumChina&#xff0c;它本身就发布了很多实用教程。 在知乎的这个界面也有Altium Designer Ver18_官…

c++ 11标准模板(STL) std::set(六)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…

如何使用SCQA模型提高表达能力

SCQA架构是“结构化表达”工具。 一、什么是“SCQA架构”&#xff1f;‍ S&#xff08;Situation&#xff09;情景——由熟悉的情境或事实引入 C&#xff08;Complication&#xff09;冲突——指出实际面临的困境或冲突 Q&#xff08;Question&#xff09;疑问——你如何分析…

文本三剑客正则表达式3

文章目录 文本三剑客&正则表达式31 awk工作原理2 awk的基本格式及其内置变量2.1 基本格式2.2 内置变量2.3 示例2.3.1 直接打印所有内容2.3.2 取每一行的第一列2.3.3 打印行号&#xff0c;及所有内容2.3.4 打印第三行2.3.5 打印2-4行2.3.6 打印第2行和第4行2.3.7 用正则表达…

基于harbor安装私有镜像仓库

目录 Harbor介绍 Harbor安装 下载完成后&#xff0c;在压缩包解压到/usr/local目录下&#xff1a; 修改Harbor配置文件 推送本地镜像到harbor上 1、给本地镜像打一个标签 2、 设置docker的daemon.json 3、重启docker 4、使用docker登录harbor 5、把本地的镜像push到harbor…

银豆信息张雪灿:钻石级合作伙伴的增长秘诀

编者按&#xff1a; 杭州银豆信息技术有限公司&#xff08;简称“银豆”&#xff09;&#xff0c;是一家专注于云计算服务的高科技企业&#xff0c;目前已为2000家企业级客户提供了专业的行业解决方案, 与人民网、光大银行、长安汽车金融、vivo金融、浙江省农科院、淄博市大数…

MediaPipe虹膜检测:实时虹膜跟踪和深度估计

包括计算摄影(例如,人像模式和闪光反射)和增强现实效果(例如,虚拟化身)在内的大量实际应用都依赖于通过跟踪虹膜来估计眼睛位置。一旦获得了准确的光圈跟踪,我们就可以确定从相机到用户的公制距离,而无需使用专用的深度传感器。反过来,这可以改善各种用例,从计算摄影…

机器学习之SVM分类器介绍——核函数、SVM分类器的使用

系类文章目录 机器学习算法——KD树算法介绍以及案例介绍 机器学习的一些常见算法介绍【线性回归&#xff0c;岭回归&#xff0c;套索回归&#xff0c;弹性网络】 文章目录 一、SVM支持向量机介绍 1.1、SVM介绍 1.2、几种核函数简介 a、sigmoid核函数 b、非线性SVM与核函…