- 博客(76)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注

原创 超级详细GitBook和GitLab集成步骤【linux环境】
本文主要是在 gitlab 上集成 gitbook 实现提交时 gitbook 自动刷新部署 ,以及在 linux 环境上搭建 gitlab gitbook,集成 GitLab CI 实现一个企业级或个人的 Wiki 系统
2023-02-10 13:38:01
2134
5
原创 第二十三章 Nest集成日志框架Winston
Winston是一个非常流行的Node.js日志框架,而Nest.js是一个基于Node.js的后端框架。修改 winston.module.ts 内容如下 添加 forRoot 方法,接收 winston 的 createLogger 方法的参数,返回动态模块的 providers、exports。这里用到了 printf 的 format 函数,它可以自定义打印的日志格式 且使用了chalk 加上了颜色,并且打印了 dayjs 格式化的时间。可以看到控制台打印了自定义的 logger 的自定义。
2024-07-22 12:44:26
694
原创 第二十二章 了解集成日志框架Winston
winston中 内置的和社区的 transport 就足够用了,不管是想把日志发送到别的服务,还是把日志存到数据库等,都可以用不同 Transport 实现。运行 项目 可以看到不同分钟3/打印的日志会写到不同的文件中 并且使用了 DailyRotateFile 的 transport指定了文件名和日期格式。接着创建 index.js 并使用winston, 用winston 中的createLogger 创建 logger 实例。winston是一个用于Node.js的日志记录库。
2024-07-22 08:59:57
1120
原创 第二十一章 Nest 日志打印
与 console.log 不同,Nest 的日志 API 允许您将不同级别的日志记录到不同的目标,例如文件、数据库或外部日志服务。在之前 我们打印日志信息的时候 都是通过 console.log 来打印信息 ,但是这样打印 存在很多缺陷 例如没有日志的不同级别的区分不能通过开关控制是否打印等等。可以看到打印出了如下信息,其中 verbose、debug、log、warn、error 是日志的级别,[] 是 context(当前所在的上下文),最后是日志的内容。
2024-07-17 15:00:00
880
原创 第二十章 Nest 大文件分片上传
在前端的文件上传功能中,只要请求头里定义 content-type 为 multipart/form-data,内容就会以下面形式传递到服务端,接着服务器再按照multipart/form-data的格式去提取数据 获取文件数据但是当文件体积很大时 就会出现一个问题 文件越大 请求的时间会越长,会导致产品的体验很不好。
2024-07-17 09:00:00
907
1
原创 第十九章 Nest multer 文件上传
新建个 nest 项目:安装 multer 的 ts 类型的包:接着创建一个接口,用于文件上传 下面的test1接口就是用于文件上传使用 FileInterceptor 来提取 file 字段,然后通过 UploadedFile 装饰器把它作为参数传入接着运行项目可以看到我们的项目根目录下创建了一个uploads名称的文件夹在nestjs项目中设置支持跨域修改main.ts:接着 我们来编写前端的代码,创建index.html运行前端:浏览器访问:上传文件之后可以看控制台看到打印了上传的fil
2024-07-11 14:45:00
1060
原创 第十八章 Express multer 文件上传
本章将学习Express multer 文件上传 ,因为Nest 的文件上传是基于 Express 的中间件 multer 实现的,所以在学习 Nest 文件上传之前,我们先学习下 multer 包。接着我们在express 里添加错误中间件,一旦某个中间件出了错,express 就会向后找错误处理中间件来调用,如果没有,那就用默认错误处理中间件,返回 500 响应。接着点击选择文件 上传文件 看游览器的控制台 可以看到发送了请求 此时aaa 请求的 body 是多个 boundary 分隔的格式。
2024-07-11 10:00:00
693
原创 第十七章 自定义ExceptionFilter
在nestjs中,Exception Filter(异常过滤器)是用于处理全局异常的一种机制。可以看到提示的错误不对, exception filter 会拦截所有 HttpException,但是没有对这种情况做支持。但是目前只是@Catch 了 BadRequestException的异常 如果抛出的是其他异常 那么依然是原来的格式。接着我们修改 test.filter.ts 实现对ValidationPipe的支持。自此ValidationPipe 的错误和其他的错误就都返回了正确的格式。
2024-07-10 14:00:00
603
原创 第十六章 ValidationPipe验证post请求参数
我们再调用接口 age参数传11.23 也能调用成功 但是我在dto定义的时候 只定义了age 为number 但是传浮点数也能传,这个可能会导致后面的逻辑错误,所以就需要用到 ValidationPipe。我们创建了一个dto类 ----> 接着在pipe拿到类 将参数通过class-transformer 转换为 dto 类的对象,最后使用class-validator 包来对这个对象做验证。注意:post请求带参数 我们通过游览器路径是直接请求不了的 需要使用postman 来发 post 请求。
2024-07-10 09:15:00
407
原创 第十五章 Nest Pipe(内置及自定义)
浏览器访问这就是Pipe返回的值控制台打印了 value 就是 query、param 的值,而 metadata 里包含 type、metatype、datatype 就是 @Query、@Param、@Body 装饰器,或者自定义装饰器metatype 是参数的 ts 类型data 参数值。
2024-07-08 09:03:09
1041
1
原创 第十四章 RxJS及Interceptor
首先 我们来了解一下RxJS,RxJS是一个基于观察者模式的响应式编程库,它是ReactiveX的JavaScript版本。它提供了一组强大的操作符和工具,用于处理异步数据流。通过使用RxJS,开发者可以轻松地处理各种异步操作,如处理用户输入、处理网络请求、处理定时器等等。它使用Observable对象来表示数据流,并提供了各种操作符来转换、过滤和组合数据流中的值。RxJS的主要思想是将异步操作看作是一个数据流,并通过操作符来处理这个数据流,从而简化异步编程和数据流处理的复杂性。
2024-07-08 09:00:33
1774
原创 第十三章 Nest Middleware
可以看到只有 / /test 这两个接口才调用到Middleware中间件 以上就是 Nest 里 middleware 的用法。可以看到上面图片 Middleware 是通过class实现的,使用class实现可以让我们进行依赖注入,例如。可以看到 我们调用了service,这就是 Nest 注入的依赖。这样调用接口的时候就会使用到TestMiddleware。当然我们也可以指定一些路由用到Middleware,接着我们访问需要知道到中间件的接口 例如。
2024-07-04 13:00:00
380
原创 第十二章 Nest中 Express 和 Fastify
其可以通过use一个个中间件来处理请求和返回响应(洋葱模型),我们基于这些中间件能实现各种功能 ,但Express 只是一个处理请求的库,没有开发规范和组织架构的能力,会导致写出来的代码参差不齐 不同人写的代码会差距可能很大。是一个处理请求、响应的库。注意 Nest没有和 Express 进行强耦合 而是做了一层抽象,之后分别提供了 express 和 fastify 的实现,所以我们可以在Nest项目灵活的切换express和 fastify。第一层:直接使用 http、https 的模块。
2024-07-04 09:00:00
2721
原创 第十一章 Nest 创建动态模块
但是这个模块目前是静态的 内容固定不变 当我们想在mport 的时候给这个模块传一些参数,动态生成模块的内容 就可以使用 Dynamic Module动态模块。forFeature 是用于在特定模块中注册模块的方法。它将模块中的提供者和导出的模块注册为仅在该模块中可访问的。forRoot 是用于在根模块中注册模块的方法。它将模块中的提供者和导出的模块注册为全局可访问的,这意味着其他模块可以直接使用这些提供者和导出的模块。这样我们就可以在 import 一个模块的时候,传入参数,然后动态生成模块的内容。
2024-07-02 12:00:00
1360
原创 第十章 Nest 解决Module和Provider循环依赖问题
如果 Test1Module 需要使用 Test2Module 中的一个服务,而 Test2Module 同样需要使用 Test1Module 中的服务,就会出现循环依赖。错误的原因是模块之间的依赖循环 报错的提示说了 我们可以使用 forwardRef() 来解决这个问题。forwardRef 的作用就是先进行创建 单独创建两个module 都创建成功之后再进行引入。除了Module 之间会循环依赖 provider 之间也会有循环引用的异常报错问题。可以看到报错了 是循环依赖引起的报错。
2024-07-02 09:00:00
535
原创 第九章 Nest 自定义装饰器
这个函数创建了一个参数装饰器MyHeaders,用于在NestJS中获取HTTP请求的头部信息。在装饰器函数内部,通过ctx.switchToHttp().getRequest()切换到HTTP上下文并获取请求对象。在app.controller.ts 中 新增接口test3 使用上面定义的 @Param() 装饰器。修改 app.controller.ts 新增getTest函数 使用 自定义的Test装饰器。我们来尝试一下,实现一个获取请求头信息的装饰器。此时 三个接口的装饰器实现的效果都是一样的。
2024-07-01 12:00:00
1055
原创 第八章 Nest ArgumentHost 和 ExecutionContext
ExecutionContext类包含了处理器方法的上下文信息,它提供了一系列方法来获取请求的原始对象、路由处理器、控制器实例等。ArgumentHost类包含了请求的上下文信息,它提供了一个统一的方式来访问请求参数、头部、查询参数等。在NestJS中,ArgumentHost和ExecutionContext是两个常用的类,用于处理请求和返回的上下文信息。可以看到 打印出的信息就是 test.filter.ts 里的console.log 打印出来的信息。
2024-07-01 09:00:00
1029
原创 第七章 Nest 装饰器
NestJS是一个基于Node.js的开发框架,它使用装饰器来增强应用程序的功能和可读性。装饰器是一种特殊的语法,可以附加元数据或修改类、方法、属性等的行为。
2024-06-28 13:00:00
1180
原创 第六章 AOP架构 Middleware、Guard、Pipe、Interceptor、ExceptionFilter
Nest AOP 是指在 Nest.js 框架中使用面向切面编程(Aspect-Oriented Programming)的技术。面向切面编程是一种编程范式,它允许开发者通过在代码中定义切面(Aspect),来将横切关注点(Cross-cutting Concerns)与核心业务逻辑进行解耦。在 Nest.js 中,开发者可以使用 Nest AOP 模块来实现 AOP 功能。通过使用装饰器(Decorator)来定义切面,并使用注入依赖(Dependency Injection)来实现对切面的使用。
2024-06-28 12:00:00
968
原创 第五章 Nest 生命周期
nest 有着以下生命周期:1. onModuleInit()2. onApplicationBootstrap()3. onModuleDestroy()4. onApplicationShutdown()
2024-06-27 12:00:00
1203
原创 第三章 Nest 断点调试项目
我们将学习用VSCode 来调试nest项目 首先打开VSCode 软件 可以看到左侧的图标如下(这里我用的中文版插件 大家可以安装插件)我们点击上面的 创建 **launch.json **文件 接着我们可以在项目中看到 launch.json。接着我们可以点击左侧圈红的地方 打断点 点击右侧圈红的地方开始一行行调试。我们可以通过打断点的方法 ,了解代码的执行过程。接着运行 demo.js 以调试模式跑起来。接着我们可以打断点 如下 再次刷新界面。首先我们先了解node项目的调试流程。
2024-06-25 13:00:00
1402
原创 第二章 快速认识 IoC
在后端的系统中 会有很多对象 比如Controller 对象(接收 http 请求,调用 Service,返回响应数据)、Service 对象(实现业务逻辑)、Repository 对象(实现对数据库的增删改查)、DataSource 对象(数据库链接)、 Config 对象 (配置对象 )这些对象之间的关系很复杂 且有些对象需要一系列的初始化之后吃能使用 有些对象不需要每次都new一个新的,而IoC就是用来解决这些痛点,Nest就是使用Ioc来实现的。nest 在背后自动做了对象创建和依赖注入的工作。
2024-06-25 09:00:00
1011
原创 第一章 快速掌握 Nest CLI
不使用 --skip-import 时可以看到 src/app.model.ts 被更新了 说明被引入了 ,但是使用了 --skip-import 时只有创建 没有更新src/app.model.ts 说明没有被引入。可以看到生成的目录结构不一样 --no-flat 和默认 会生成 www文件夹(目录),而 --flat 不会生成文件夹(目录)-b, --builder [name] 要使用的构建器(tsc, webpack, swc)。-g, --skip-git 跳过git存储库初始化。
2024-06-24 09:00:00
1512
原创 TypeScript 从入门到进阶之基础篇(十) 抽象类篇
TypeScript抽象类是一种用于定义其他类的基础类,它不能直接被实例化,只能被继承。抽象类可以包含属性、方法、以及其他抽象方法的定义。抽象方法只有定义而没有具体实现,需要在具体的子类中实现。抽象类通过使用关键字 abstract 来定义,而抽象方法通过在方法前加上关键字 abstract 来定义。抽象类和抽象方法用于定义类的行为和结构,并且可以提供一些通用的实现或规范,以供子类继承和实现。不能直接实例化:抽象类不能被直接实例化只能被继承后使用。可以包含属性和方法:抽象类中可以定义属性和方法。
2024-01-14 12:06:30
1883
3
原创 vue3 ts defineProps、defineEmits、defineExpose、defineOptions、defineSlots
本章我们来讲解vue3 ts 中 defineProps、defineEmits、defineExpose、defineOptions、defineSlots的使用及作用。在Vue3中,defineProps、defineEmits、defineExpose、defineOptions、defineSlots是一组新的功能函数,用于定义组件的属性、事件、暴露、选项和插槽。defineProps:用于定义组件的属性。通过调用该函数,可以声明组件的属性,并且将属性的类型、默认值等信息进行声明。
2024-01-10 19:56:31
5501
2
原创 前端项目构建打包生成Git信息文件
前端项目构建打包生成Git信息文件的作用是将当前代码所属的Git仓库的相关信息(例如commit hash、branch name、commit message等)保存在项目中的一个文件中。这样做的目的是为了方便在程序中获取和展示当前代码的版本信息,以及方便对项目进行版本管理和追踪。
2024-01-10 19:53:12
1978
2
原创 vue3 内置组件
在vue3中 其提供了5个内置组件,其中是用于状态变化的过渡和动画KeepAlive是用于多个组件间动态切换时缓存被移除的组件实例Teleport是用于将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去Suspense目前还是实验性功能,是用来在组件树中协调对异步依赖的处理。接下来我们详细介绍每一个组件的用法及应用场景。
2024-01-08 20:08:25
1636
5
原创 TypeScript 从入门到进阶之基础篇(九) Class类篇
在JavaScript中class(类)是一种组织代码的方式,它允许我们创建对象和对象的行为。它是一种面向对象编程(OOP)的概念,在ES6中被引入,通过class关键字,可以定义类。使用class关键字可以定义类,通过类可以创建多个实例对象。本章将讲解如何在TypeScript 中使用class(类)。可以使用接口来定义类。可以在接口中定义类的属性和方法,并且类需要遵循接口的定义。");// 输出 "Woof!
2024-01-08 20:02:51
1462
1
原创 vue3 响应式api中特殊的api
shallowReactive() 函数用于创建一个浅响应式对象,意味着只有对象的顶层属性会被劫持成响应式的,而嵌套的属性不会被劫持成响应式的。在 Vue 3 中,默认情况下,所有的对象都会被追踪并成为响应式对象,即当对象发生变化时,相关的界面会自动更新。这样的设计可以提高性能,因为对于大型的复杂对象,如果每次属性变化都进行递归的响应式处理,会带来很大的性能开销。只能将一层响应式对象转换为普通对象,如果转换的对象存在嵌套的响应式对象,则嵌套的响应式对象仍然是代理对象。如果传入的对象不是响应式对象,
2024-01-07 16:13:58
1192
5
原创 vue3 修饰符大全(近万字长文)
本文是为了系统性的了解vue3中的修饰符,方便开发时的使用,使用修饰符可以方便地对事件进行控制和处理,提升用户体验。
2024-01-07 14:29:12
3371
3
原创 TypeScript 从入门到进阶之基础篇(八)函数篇
函数是一种可重复使用的代码块,是构建应用的一块基石。在本章我们将学习TypeScript 中如何定义函数。在JavaScript中,函数可以被定义、调用和传递给其他函数作为参数。函数可以用来组织代码,使其更加模块化和可读性,同时也提供了代码的重用性和灵活性。在TypeScript 使用函数的方法是直接定义函数所需参数的类型,也是最基本的用法//箭头函数写法需要注意的是 但我们的函数没有返回值时 ,就不能定义这个函数的返回值类型 (void除外)//正确写法//正确写法2。
2024-01-07 13:13:51
1148
1
原创 TypeScript 从入门到进阶之基础篇(七)泛型篇
本章将学习在TypeScript中如何使用泛型,泛型是TypeScript很重要的东西。在实际项目中有很多地方用到了泛型。TS中的泛型(Generics)是一种在函数、类和接口中使用参数化类型的方式。它允许我们在定义和使用时指定类型,从而增加代码的灵活性和可重用性。通过使用泛型,我们可以编写通用的数据结构和算法,使代码更加抽象和可扩展。
2024-01-07 12:38:55
1087
1
原创 TypeScript 从入门到进阶之基础篇(六) 类型(断言 、推论、别名)| 联合类型 | 交叉类型
在一到五章,我们学习了在TypeScript 中 定义和使用各种类型 ,本章我们来学习TypeScript 在 类型(断言 、推论、别名)| 联合类型 | 交叉类型请注意 本章内容 可能会出现在你面试时的面试题 是面试题常问的内容。
2024-01-07 10:01:28
1505
15
原创 TypeScript 从入门到进阶之基础篇(五) 枚举类型篇
前面我们了解了基础类型、引用类型、元组类型、 symbol 类型的使用,本章我们来了解TypeScript中如何使用枚举类型。在TypeScript中,枚举(Enumeration)类型是一种用于定义命名常量集合的数据类型。枚举类型是将相关的常量值分配一个有意义的名字,在代码中使用这些名字来表示某种状态或选项。它可以使代码更具可读性和可维护性。在TypeScript中使用枚举 是通过 enum 关键字来进行定义的在TypeScript中 我们如果要定义一个从0开始的数据枚举 如下面代码。
2024-01-07 09:19:56
1213
3
原创 解决vue3中watch 监听不到旧值的问题,亲测有效!
这个问题是我在公司vue3项目的时候发现的一个问题,watch 在监听变量的变化时,发现对象的数据变化时 旧数据 获取到的和新数据是一样的 类似于下面这样数据变化之后显示出来的如下 :打印出来的值 {a:'改变值',b:6 } {a:'改变值',b:6 }当我打印出同样数据的时候 我一脸懵逼 甚至于怀疑自己代码写错了。但是检查一圈 发现代码没有任何错误。然后我用数组去实验了一下 发现 监听数组时也监听到的都是新数据。
2024-01-06 23:02:09
3348
6
原创 TypeScript 从入门到进阶之基础篇(四) symbol类型篇
前面我们了解了基础类型、引用类型、元组类型的使用,本章我们来了解TypeScript中如何使用symbol类型,当然 symbol类型要是属于JavaScript,可能有很多同学还不知道symbolsymbol类型是 ES6 引入的一种新的原始数据类型,用来表示唯一的、不可变的值。Symbol值通过Symbol()函数生成,每个Symbol值都是唯一的,可以用于对象的属性名,从而避免属性名冲突的问题。自ECMAScript 2015起,symbol成为了一种新的原生类型。
2024-01-06 21:41:25
1641
1
原创 TypeScript 从入门到进阶之基础篇(三) 元组类型篇
在前面 我们学习了 在TypeScript 中如何使用、定义基础类型以及 TypeScript 中 引用类型的使用、定义,本章我们来讲解一个TypeScript 中独有的元组类型在TypeScript中,元组类型是一种特殊的数组类型,它允许你在一个数组中存储多个不同类型的元素。元组类型使用固定的序列来定义每个元素的类型,并且元素的数量是有限的。*注意:元组就是数组的变种是固定数量的不同类型的元素的组合。
2024-01-06 21:10:55
1546
3
原创 TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇
在上一章我们学习了在TypeScript 中如何使用、定义基础类型,本章我们将对TypeScript 中的 对象 、数组类型进行学习 ,在本章的学习中 你将了解到在TypeScript 使用引用类型与在 JavaScript 使用引用类型的区别及对应TypeScript 的知识在TypeScript 中 我们也可以通过接口来定义数组 ,用法与对象定义中的任意属性差不多,其实就是定义一个接口中 key为numbr类型 定义数组下标 value为我们的数组类型。
2024-01-04 21:55:27
1455
7
前端当组长如何管理 有没有人传授一下经验
2022-08-16
laravel前后端分离项目接口怎么实现排序后分页
2021-09-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人