庆云古诗词

庆云古诗词

NestJs学习总结篇

淘文章 0

2023年11月20日 每日一猜答案: 答案:ABC
每日一猜答案分析:

nestjs module,nestjs ddd,nestjs前景,nestjs nodejs

原文地址 http://blog.【【微信】】.top/2022/05/25/nest-summary

Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 Ja【【微信】】 的渐进增强的能力,使用并完全支持 TypeScript (仍然允许开发者使用纯 Ja【【微信】】 进行开发),并结合了 OOP (面向对象编程)、FP (函数式编程)和 FRP (函数响应式编程)。

  • 在底层,Nest 构建在强大的 HTTP 服务器框架上,例如 Express (默认),并且还可以通过配置从而使用 Fastify !
  • Nest 在这些常见的 Node.js 框架 (Express/Fastify) 之上提高了一个抽象级别,但仍然向开发者直接暴露了底层框架的 API。这使得开发者可以自由地使用适用于底层平台的无数的第三方模块。

本文基于nest8演示

创建一个项目

以下是这些核心文件的简要概述

  • 带有单个路由的基本控制器示例。
  • 应用程序的根模块。
  • 应用程序入口文件。它使用 【【淘密令】】 用来创建 Nest 应用实例。

包含一个异步函数,它负责引导我们的应用程序:

  • 暴露了一些静态方法用于创建应用实例
  • 方法返回一个实现 接口的对象, 并提供一组可用的方法

有两个支持开箱即用的 HTTP 平台: 和 。 您可以选择最适合您需求的产品

  • Express 是一个众所周知的 node.js 简约 Web 框架。 这是一个经过实战考验,适用于生产的库,拥有大量社区资源。 默认情况下使用 包。 许多用户都可以使用 ,并且无需采取任何操作即可启用它。
  • 是一个高性能,低开销的框架,专注于提供最高的效率和速度。

Nest中的控制器层负责处理传入的请求, 并返回对客户端的响应。

控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作

通过NestCLi创建控制器:

可以看到支持的命令

常用命令:

  • 创建控制器:
  • 创建服务:
  • 创建模块:
  • 默认以src为根路径生成

表示创建posts的控制器,这个时候会在src目录下面生成一个posts的文件夹,这个里面就是posts的控制器,代码如下

创建好控制器后,会自动的在 中引入,代码如下

Nestjs提供了其他HTTP请求方法的装饰器 、 、 、 、 和

在Nestjs中获取传值或者交的数据的话我们可以使用Nestjs中的装饰器来获取。

示例

注意

  • : 当请求处理程序返回 Ja【【微信】】 对象或数组时,它将自动序列化为 JSON。但是,当它返回一个字符串时,Nest 将只发送一个字符串而不是序列化它

Nestjs中的服务可以是 也可以是。他们都可以。服务本质上就是通过 装饰器注解的类。在Nestjs中服务相当于的

创建服务

创建好服务后就可以在服务中定义对应的方法

模块是具有 装饰器的类。 装饰器提供了元数据,Nest 用它来组织应用程序结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MXi21qcY-【【QQ微信】】43)(https://s.【【微信】】.work/uploads/2022/05/fcc23bae4de7fa32.png)]

每个 Nest 应用程序至少有一个模块,即根模块。根模块是 Nest 开始安排应用程序树的地方。事实上,根模块可能是应用程序中唯一的模块,特别是当应用程序很小时,但是对于大型程序来说这是没有意义的。在大多数情况下,您将拥有多个模块,每个模块都有一组紧密相关的功能。

@【【微信】】() 装饰器接受一个描述模块属性的对象:

  • 由 Nest 注入器实例化的提供者,并且可以至少在整个模块中共享
  • 必须创建的一组控制器
  • 导入模块的列表,这些模块导出了此模块中所需提供者
  • 由本模块提供并应在其他模块中可用的提供者的子集

Nestjs中的共享模块

每个模块都是一个共享模块。一旦创建就能被任意模块重复使用。假设我们将在几个模块之间共享 Po【【微信】】 实例。 我们需要把 Po【【微信】】 放到 【【微信】】 数组中:

可以使用 一键创建以上需要的各个模块

NestJS中配置静态资源目录完整代码

配置模板引擎

项目根目录新建目录然后新建

渲染页面

Nestjs中 装饰器可以渲染模板,使用路由匹配渲染引擎

cookie和session的使用依赖于当前使用的平台,如:express和fastify 两种的使用方式不同,这里主要记录基于express平台的用法

cookie可以用来存储用户信息,存储购物车等信息,在实际项目中用的非常多

引入注册

接口中设置cookie 使用response

请求该接口,响应一个cookie

cookie相关配置参数

  • String 指定域名下有效
  • Date 过期时间(秒),设置在某个时间点后会在该后失效
  • Boolean 默认为 如果为表示不允许客户端(通过来获取)
  • String 最大失效时间(毫秒),设置在多少时间后失效
  • String 表示影响到的路径,如:如果路径不能匹配的时候,浏览器则不发送这个
  • Boolean 当 值为 时, 在 HTTP 中是无效,在 中才有效
  • Boolean 表示是否签名,如果设置为的时候表示对这个签名了,这样就需要用获取值不是使用了

获取cookie

Cookie加密

  • 是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而保存在服务器上
  • 当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一个类似于key,value的键值对, 然后将key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带key(cookie),找到对应的session(value)。 客户的信息都保存在session中

安装 express-session

session相关配置参数

  • String 生成签名的密钥
  • String 客户端的的名称,默认为, 可自己设置
  • Boolean 强制保存 即使它并没有变化, 默认为, 建议设置成
  • Boolean 强制将未初始化的 存储。当新建了一个 且未设定属性或值时,它就处于 未初始化状态。在设定一个 前,这对于登陆验证,减轻服务端存储压力,权限控制是有帮助的。默认:, 建议手动添加
  • 【【微信】】 设置返回到前端属性,默认值为。
  • Boolean 在每次请求时强行设置 ,这将重置 过期时间, 默认为

接口中设置session

获取session

跨域,路径前缀,网络安全

限速:限制客户端在一定时间内的请求次数

在需要使用的模块引入使用,这里是全局使用,在中引入。这里设置的是:1分钟内只能请求10次,超过则报status为429的错误

  • 管道:数据处理与转换,数据验证
  • 守卫:验证用户登陆,保护路由
  • *:对请求响应进行拦截,统一响应内容
  • 过滤器:异常捕获
  • 中间件:日志打印

执行顺序(时机)

从客户端发送一个post请求,路径为:,请求参数为:,到服务器接收请求内容,触发绑定的函数并且执行相关逻辑完毕,然后返回内容给客户端的整个过程大体上要经过如下几个步骤:

全局使用: 管道 - 守卫 - * - 过滤器 - 中间件。统一在main.ts文件中使用,全局生效

常用内置管道,从导出

  • :将字符串数字转数字
  • :验证管道

局部使用管道

  • 匹配整个路径,使用UsePipes

  • 只匹配某个接口,使用UsePipes

  • 在获取参数时匹配,一般使用内置管道

自定义管道

使用快捷命令生成:

自定义守卫

使用快捷命令生成:

局部使用守卫

自定义守卫中使用到了自定义装饰器

使用快捷命令生成:

局部使用过滤器

自定义过滤器

使用快捷命令生成:

局部使用中间件

自定义中间件

函数式中间件

从客户端发送一个post请求,路径为:,请求参数为:,到服务器接收请求内容,触发绑定的函数并且执行相关逻辑完毕,然后返回内容给客户端的整个过程大体上要经过如下几个步骤:`

项目需要包支持:

  • 针对Ja【【微信】】的反应式扩展,支持更多的转换运算

  • 转换xml内容变成json格式

  • 、 管道验证包和转换器

建立user模块:模块内容结构:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e4GVmIUq-【【QQ微信】】48)(https://s.【【微信】】.work/uploads/2022/05/6b74e9b59b24a0fd.png)]

user.controller.ts文件

user.【【微信】】.ts文件

user.【【微信】】.ts文件

user.login.dto.ts文件

app.【【微信】】.ts文件

新建common文件夹里面分别建立对应的文件夹以及文件: 中间件(middleware) ― xml.middleware.ts 守卫(guard) ― auth.guard.ts 管道(pipe) ― 【【微信】】.pipe.ts 异常过滤器(filters) ― http-exception.filter.ts *(interceptor) ― response.interceptor.ts

  1. 执行任何代码。
  2. 对请求和响应对象进行更改。
  3. 结束请求-响应周期。
  4. 调用堆栈中的下一个中间件函数。
  5. 如果当前的中间件函数没有结束请求-响应周期, 它必须调用 next() 将控制传递给下一个中间件函数。否则, 请求将被挂起

本例中:使用中间件让express支持xml请求并且将xml内容转换为json数组

注册方式

  • 全局注册:在中导入需要的中间件模块如:XMLMiddleware然后使用 即可

  • 模块注册:在对应的模块中注册如:

同一路由注册多个中间件的执行顺序为,先是全局中间件执行,然后是模块中间件执行,模块中的中间件顺序按照中注册的顺序执行

守卫控制一些权限内容,如:一些接口需要带上token标记,才能够调用,守卫则是对这个标记进行验证操作的。 本例中代码如下:

注册方式

  • 全局注册:在中导入需要的守卫模块如:。然后使用 即可
  • 模块注册:在需要注册的控制器中导入。然后从中导装饰器。最后直接放置在对应的或者等装饰器之下即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uOPAqmQp-【【QQ微信】】52)(https://s.【【微信】】.work/uploads/2022/05/976e8bcbe31b38ce.png)]

同一路由注册多个守卫的执行顺序为,先是全局守卫执行,然后是模块中守卫执行

想到自定义返回内容如

这个时候就可以使用*来做一下处理了。 *作用:

  1. 在函数执行之前/之后绑定额外的逻辑
  2. 转换从函数返回的结果
  3. 转换从函数抛出的异常
  4. 扩展基本函数行为
  5. 根据所选条件完全重写函数 (例如, 缓存目的)

*的执行顺序分为两个部分:

  • 第一个部分在管道和自定义逻辑(next.handle()方法)之前。
  • 第二个部分在管道和自定义逻辑(next.handle()方法)之后。

中间多了个全局管道以及自定义逻辑,即只有路由绑定的函数有正确的返回值之后才会有之后的内容

注册方式

  • 全局注册:在中导入需要的模块如:。然后使用 即可
  • 模块注册:在需要注册的控制器中导入。然后从中导入装饰器。最后直接放置在对应的或者…等装饰器之下即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B6CnUTpC-【【QQ微信】】54)(https://s.【【微信】】.work/uploads/2022/05/099d67812f591bc5.png)]

同一路由注册多个*时候,优先执行模块中绑定的*,然后其*转换的内容将作为全局*的内容,即包裹两次返回内容如:

  • 管道是请求过程中的第四个内容,主要用于对请求参数的验证和转换操作。

  • 项目中使用 进行配合验证相关的输入操作内容

认识官方的三个内置管道

  1. :基于和这两个npm包编写的一个常规的验证管道,可以从导入配置规则,然后直接使用验证(当前不需要了解的原理,只需要知道从引规则,设定到对应字段,然后使用即可)
  2. :转换传入的参数为数字

如:传递过来的是/test?id=‘123’"这里会将字符串‘123’转换成数字123 3. ParseUUIDPipe:验证字符串是否是 UUID(通用唯一识别码)

如:传递过来的是/test?id=‘xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx’"这里会验证格式是否正确,不正确则抛出错误,否则调用findOne方法

本例中管道使用如下:

注册方式

  • 全局注册:在中导入需要的模块如:;然后使用 即可
  • 模块注册:在需要注册的控制器中导入;然后从中导入装饰器;最后直接放置在对应的或者等装饰器之下即可,管道还允许注册在相关的参数上如:等

**注意:**同一路由注册多个管道的时候,优先执行全局管道,然后再执行模块管道:

  • 异常过滤器是所有抛出的异常的统一处理方案
  • 简单来讲就是捕获系统抛出的所有异常,然后自定义修改异常内容,抛出友好的提示。

内置异常类

系统提供了不少内置的系统异常类,需要的时候直接使用throw new XXX(描述,状态)这样的方式即可抛出对应的异常,一旦抛出异常,当前请求将会终止。

注意每个异常抛出的状态码有所不同。如:

本例中使用的是自定义的异常类,代码如下:

注册方式

  • 全局注册:在中导入需要的模块如: 然后使用 即可
  • 模块注册:在需要注册的控制器中导入然后从中导入装饰器;最后直接放置在对应的或者等装饰器之下即可

注意: 同一路由注册多个管道的时候,只会执行一个异常过滤器,优先执行模块中绑定的异常过滤器,如果模块中无绑定异常过滤则执行全局异常过滤器

如何 限制 和 验证 前端传递过来的数据?

常用:(data transfer object数据传输对象) + ,自定义提示内容,还能集成swagger

class-【【微信】】的验证项装饰器

https://github.com/typestack/class-【【微信】】#usage

全局使用内置管道 ,不然会报错,无法起作用

编写,使用的校验项验证

创建DTOÿ


LotHelper|Free SMS Receiver|免费接码|免费手机号|免费短信验证码

lot和lots of的区别,lot和loa,Lot和lot of的区别,Lot和lots of和a lot of有什么区别
+14849302608

归属国家: 美国

更新时间: 2023-03-17 00:17:01

查看信息

+15877990697

归属国家: 加拿大

更新时间: 2023-03-17 00:16:59

查看信息

+12103317306

归属国家: 美国

更新时间: 2023-03-17 00:16:18

查看信息

+16283361718

归属国家: 美国

更新时间: 2023-03-17 00:01:02

查看信息

+16802062477

归属国家: 美国

更新时间: 2023-03-17 00:01:00

查看信息

+18733631217

归属国家: 加拿大

更新时间: 2023-03-16 23:02:55

查看信息

+19733580668

归属国家: 美国

更新时间: 2023-03-16 20:26:56

查看信息