首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一个参数验证,学会 Nest.js 两大机制:Pipe、ExceptionFilter

整体架构如图: 整个 IOC 容器内有多个 Controller、Service、Respository 等实例,分散在不同 Module 。...请求是在 Controller 里处理,调用 Service 来完成业务逻辑,其中对数据库 CRUD 由 Repository 完成。 那么对参数 validate 应该放在哪呢?...这就是 Pipe 作用。 所以,我们在 pipe 对参数做 validate 就行了。...还有,大家有没有注意到,我们只是返回了一个 BadRequestException error,但是服务器就返回了 400 相应,这个是什么原因呢?...ExceptionFilter 可以监听不同类型 exception,做不同响应。 内置有很多 Pipe 和 ExceptionFilter 可以直接用,不够时候还可以自己定义。

1.2K10

Nest.js 实战系列四:使用管道、DTO 验证入参,摆脱 if-else 恐惧

使用 DTO 可以清晰了解对象结构,使用 Pipes(管道)配合 class-validator 还可以对参数类型进行判断,还可以在验证失败时候抛出错误信息。...数据传输对象(DTO)(Data Transfer Object),是一种设计模式之间传输数据软件应用系统。数据传输目标往往是数据访问对象从数据库检索数据。...概念 管道和拦截器有点像,都是在数据传输过程“关卡”,只不过各司其职。...管道有两个类型: 转换:管道将输入数据转换为所需数据输出; 验证:对输入数据进行验证,如果验证成功继续传递,验证失败则抛出异常; ValidationPipe 是 Nest.js 自带三个开箱即用管道之一...实战系列二:数据库连接与使用 Nest.js 实战系列一:项目创建&路由设置&模块 Nest.js 实战系列三:JWT 实现单点登录 Nest.js 实战系列四:使用中间件、拦截器、过滤器打造日志系统

3.7K20
您找到你想要的搜索结果了吗?
是的
没有找到

Nest.js 实践总结

模块划分 Nest.js 是以模块化结构为基础,服务端应用应该按功能职责被划分为几个部分,通常情况下,将你目录结构应该按模块划分而不是按类型分成文件夹。...以下是按类型划分文件夹(不推荐): 以下是按模块划分文件夹(推荐): 对于 Nest.js,模块是一个包含 .module.ts 文件文件夹,其中包含一个 @Module({}) 装饰器。...应该使用 Data Mapper/Repository 模式,而不是 Active Record 如果你正在使用 PostgreSQL 或 MySQL 等关系数据库,那么使用 TypeOrm,它是 Typescript...TypeOrm 可以使用两种模式,一种是由 ruby on rails 推广活动记录模式,另一种是使用存储库数据映射器模式。...如果是需要隐藏某些字段,可以使用 @Exclude () 装饰器。

1.7K20

Nest.js 从零到壹系列(五):使用管道、DTO 验证入参,摆脱 if-else 恐惧

使用 DTO 可以清晰了解对象结构,使用 Pipes(管道)配合 class-validator 还可以对参数类型进行判断,还可以在验证失败时候抛出错误信息。...数据传输对象(DTO)(Data Transfer Object),是一种设计模式之间传输数据软件应用系统。数据传输目标往往是数据访问对象从数据库检索数据。...概念 管道和拦截器有点像,都是在数据传输过程“关卡”,只不过各司其职。...管道有两个类型: 转换:管道将输入数据转换为所需数据输出; 验证:对输入数据进行验证,如果验证成功继续传递,验证失败则抛出异常; ValidationPipe 是 Nest.js 自带三个开箱即用管道之一...从零到壹系列(一):项目创建&路由设置&模块● Nest.js 从零到壹系列(二):数据库连接● Nest.js 从零到壹系列(三):使用 JWT 实现单点登录 ·END·

4K41

Nest.js 实践总结分享

模块划分 Nest.js 是以模块化结构为基础,服务端应用应该按功能职责被划分为几个部分,通常情况下,将你目录结构应该按模块划分而不是按类型分成文件夹。...以下是按类型划分文件夹(不推荐): 以下是按模块划分文件夹(推荐): 对于 Nest.js,模块是一个包含 .module.ts 文件文件夹,其中包含一个 @Module({}) 装饰器。...应该使用 Data Mapper/Repository 模式,而不是 Active Record 如果你正在使用 PostgreSQL 或 MySQL 等关系数据库,那么使用 TypeOrm,它是 Typescript...TypeOrm 可以使用两种模式,一种是由 ruby on rails 推广活动记录模式,另一种是使用存储库数据映射器模式。...如果是需要隐藏某些字段,可以使用 @Exclude () 装饰器。

1.9K10

Nest.js 从零到壹系列(七):讨厌写文档,Swagger UI 了解一下?

: string | number; } 保存,刷新页面(该页面没有热加载功能),再看看效果: 看到已经有了字段信息了,但是我们 role 字段是【可选】,而文档是【必填】,接下来再完善一下描述...那么,如何在 Swagger 登录呢?...示例参数 前面登录时候,需要手动输入用户名、密码,那么有没有可能,事先写好,这样前端来看文档时候,直接用默认账号登录就行了呢?...本篇只是抛砖引玉, Swagger UI 还有很多可配置玩法,比如数组应该怎么写,枚举应该怎么弄,如何设置请求头等等,因为篇幅原因,就不在这里展开了。...从零到壹系列(二):数据库连接● Nest.js 从零到壹系列(四):使用中间件、拦截器、过滤器打造日志系统● Nest.js 从零到壹系列(六):用 15 行代码实现 RBAC 0 ·END·

4.4K10

学完这篇 Nest.js 实战,还没入门来锤我!(长文预警)

路由装饰器 Nest.js没有单独配置路由地方,而是使用装饰器。Nest.js定义了若干装饰器用于处理路由。...我们如果直接使用Node.js操作mysql提供接口, 那么编写代码就比较底层, 例如一个插入数据代码: // 向数据库插入数据 connection.query(`INSERT INTO posts...; @Column() title: string; } 复制代码 最开初我设计表title字段时,字段类型直接设置成string,也就对应数据库类型是varchar(255),后来觉得不合适...我这里用swagger,用它原因一方面是 Nest.js提供了专用模块来使用它,其次可以精确展示每个字段意义,只要注解写到位!...接口直接报500了, 因为我们实体定义author字段不能为空,所有在写入数据时报错了。这样体验非常不好, 很可能前端就怀疑我们接口写错了,所有我们应该对异常进行一定处理。

9.3K11

学完这篇 Nest.js 实战,还没入门来锤我!(长文预警)

路由装饰器 Nest.js没有单独配置路由地方,而是使用装饰器。Nest.js定义了若干装饰器用于处理路由。...我们如果直接使用Node.js操作mysql提供接口, 那么编写代码就比较底层, 例如一个插入数据代码: // 向数据库插入数据 connection.query(`INSERT INTO posts...; @Column() title: string; } 最开初我设计表title字段时,字段类型直接设置成string,也就对应数据库类型是varchar(255),后来觉得不合适...我这里用swagger,用它原因一方面是 Nest.js提供了专用模块来使用它,其次可以精确展示每个字段意义,只要注解写到位!...接口直接报500了, 因为我们实体定义author字段不能为空,所有在写入数据时报错了。这样体验非常不好, 很可能前端就怀疑我们接口写错了,所有我们应该对异常进行一定处理。

12.2K42

Nest.js进阶系列四:Node.js中使用Redis原来这么简单!

Nest.js系列文章我们其实留了两个可以用redis优化地方: 一个是我们在做登录时,通过JWT已经实现了服务端生成token以及验证客户端发送token信息。...不仅仅支持简单 key-value 类型数据 还支持:字符串、hash、列表、集合、有序集合 支持多种编程语言等等 Redis 典型使用场景 缓存 缓存可以说是Redis最常用功能之一了, 合理缓存不仅可以加快访问速度...纸上谈兵终觉浅,必须实战一波~ Redis安装和简单使用,我这里就不一一介绍了,这里贴上我之前写两篇文章: Redis 安装 Redis入门篇-基础使用 可以快速安装、了解Redis数据类型以及常用命令...在Nest.js使用 版本情况: 库 版本 Nest.js V8.1.2 项目是基于Nest.js 8.x版本,与Nest.js 9.x版本使用有所不同, 后面的文章专门整理了两个版本使用不同点说明...,内置是内存数据存储,但是也可使用 cache-manager来使用其他方案, 比如使用Redis来缓存。

2.2K30

Nest.js 是如何实现 AOP 架构

此外,Nest.js 还提供了 AOP (Aspect Oriented Programming)能力,也就是面向切面编程能力: AOP AOP 是什么意思呢?什么是面向切面编程呢?...而且,就像 Middleware 支持全局级别和路由级别一样,Guard 也可以全局启用: Guard 可以抽离路由访问控制逻辑,但是不能对请求、响应做修改,这种逻辑可以使用 Interceptor...Controller 之前之后处理逻辑可能是异步Nest.js 里通过 rxjs 来组织它们,所以可以使用 rxjs 各种 operator。...但是它们之间顺序关系是什么呢? 调用关系这个得看源码了。...而 Middleware 是 express 概念,Nest.js 只是继承了下,那个是在最外层被调用。 这就是这几种 AOP 机制调用顺序。

1.1K10

几个一看就会 TypeScript 小技巧

应该是 string,也就是 K extends string。 但是 JS 属性可以是 string、number、symbol 这三种类型。...所以 number 就可以赋值给 {}、Object 类型,但是不能赋值给 object 类型: 其实,你看源码会发现大家不会用 object 来约束,而是用 Record<string, any...而且你会在很多源码里看到这种写法,比如下面是 Nest.js 源码里: -readonly 映射类型可以构造一个新索引类型,并且构造过程做一些修改。...,就能检查出 this 指向对象是否是对: 而且,TypeScript 也提供了一个内置高级类型 ThisParameterType 用于提取 this 类型: 它实现很简单,就是通过模式匹配提取...object 不能接收原始类型,而 {} 和 Object 都可以,这是它们区别。

2K10

NestJS、TypeORM 和 PostgreSQL 项目开发和数据库迁移完整示例(译)

为了在 Node.js 构建 API,我们将使用 Nest.js。...为了使过程更健壮,我们将为 docker 容器使用相同名称(脚本 $SERVER var),并添加一个额外检查:如果有同名容器正在运行,那么将结束并删除它以确保干净状态。...您可以简单地将它们全部放在一个文件夹,并在您配置中使用一种模式加载它们 —— 我们将我们放在 model/.entity.ts 。...例如:自动生成 uuid id 字段 和 createDateTime 字段,lastChangedDateTime 字段。 注意:这些基类应该是 abstract。...因此,您在代码更改了实体类, typeORM 会为你自动同步字段, 但是,一旦您数据库中有实际数据,后期打算修改字段类型或其他操作时,TypeORM 将通过删除并重新创建数据库表来更改数据库,这意味着你极有可能丢失了表内数据

6K21

NestJS、TypeORM 和 PostgreSQL 项目开发和数据库迁移完整示例(译)

为了在 Node.js 构建 API,我们将使用 Nest.js。...为了使过程更健壮,我们将为 docker 容器使用相同名称(脚本 $SERVER var),并添加一个额外检查:如果有同名容器正在运行,那么将结束并删除它以确保干净状态。...您可以简单地将它们全部放在一个文件夹,并在您配置中使用一种模式加载它们 —— 我们将我们放在 model/.entity.ts 。...例如:自动生成 uuid id 字段 和 createDateTime 字段,lastChangedDateTime 字段。 注意:这些基类应该是 abstract。...因此,您在代码更改了实体类, typeORM 会为你自动同步字段, 但是,一旦您数据库中有实际数据,后期打算修改字段类型或其他操作时,TypeORM 将通过删除并重新创建数据库表来更改数据库,这意味着你极有可能丢失了表内数据

5K10

NestJS、TypeORM 和 PostgreSQL 项目开发和数据库迁移完整示例(译)

为了在 Node.js 构建 API,我们将使用 Nest.js。...为了使过程更健壮,我们将为 docker 容器使用相同名称(脚本 $SERVER var),并添加一个额外检查:如果有同名容器正在运行,那么将结束并删除它以确保干净状态。...您可以简单地将它们全部放在一个文件夹,并在您配置中使用一种模式加载它们 —— 我们将我们放在 model/.entity.ts 。...例如:自动生成 uuid id 字段 和 createDateTime 字段,lastChangedDateTime 字段。 注意:这些基类应该是 abstract。...因此,您在代码更改了实体类, typeORM 会为你自动同步字段, 但是,一旦您数据库中有实际数据,后期打算修改字段类型或其他操作时,TypeORM 将通过删除并重新创建数据库表来更改数据库,这意味着你极有可能丢失了表内数据

5.3K30

Nest.js 从零到壹系列(六):用 15 行代码实现 RBAC 0

【角色互斥】:同一用户不能分配到一组互斥角色集合多个角色,互斥角色是指权限互相制约两个角色。案例:财务系统中一个用户不能同时被指派给会计角色和审计员角色。...拦截器逻辑编写 还记得第三篇签发 Token 时候,有个 role 字段么?那个就是用户角色,下面我们针对 Token role 字段进行展开。...但是,“麦林炮手”价格应该是 1350,我们修改一下价格: ? 再看看数据库,通过 u_by 字段可以知道是通过接口修改: ?...2020-3-31 更新:使用 Guard 守卫控制权限 评论区有大神指出,应该使用 Guard 来管理角色相关,因此,在这里补充一下 Guard 实现。...&模块● Nest.js 从零到壹系列(三):使用 JWT 实现单点登录● Nest.js 从零到壹系列(五):使用管道、DTO 验证入参,摆脱 if-else 恐惧 ·END·

3.4K30

Nest.js 编写 SQL 另一种方式(MyBatisMapper)

Nest.js 开发我们通常会选择 TypeORM 框架操作数据库,这对前端 SQL 弱来说确实是有很大帮助。但对于一些复杂查询显得有点麻烦,甚至比直接写 SQL 更复杂。...这里并不是说不能用 ORM 框架实现,而是手写 SQL 更有性价比。下面举了几个例子对比几种写法区别和优缺点。以及如何在 Nest.js 使用 MyBatis 语法。...TypeORM 那么可以直接使用 entityManager.query 去执行 SQL 就可以了。...我们可以创建一个 Nest.js 模块去自动读取,并且监听到变化时自动更新。简单实现如下:使用 fast-glob 查询文件,使用 chokidar 监听文件变化后重新读取。...对于小项目也没必要引入额外概念,项目复杂点是需要考虑一种更统一管理方式,对于本就复杂功能还写那么复杂构建查询,如果都使用原生 SQL 去实现功能了,不如试试在 XML 写。

9110

Nuxt.js,Next.js,Nest.js傻傻分不清?

要开始使用 Next.js,您可以按照以下步骤进行: 创建新项目:使用命令行工具,在您选择目录创建一个新 Next.js 项目。...node框架 标题:入门指南:了解 Nest.js 正文: 在现代 Web 开发,构建高性能应用程序是至关重要。...主要特性 基于 TypeScript:Nest.js 使用 TypeScript 编写,可以利用静态类型检查和强类型约束来提高代码质量和开发效率。...要开始使用 Nest.js,您可以按照以下步骤进行: 创建新项目:使用命令行工具,在您选择目录创建一个新 Nest.js 项目。...注册控制器:在模块文件,将控制器注册到相应模块。您可以使用装饰器 @Module 和 controllers 属性来完成这一步骤。

2.4K30

深入理解 Nest.js 控制器:构建强大RESTful API

处理路由参数路由参数是 URL 一部分,通常用于标识特定资源。在 Nest.js ,我们使用 @Param 装饰器来捕获这些参数。...这样,我们可以在方法访问 'id' 参数值。处理请求体数据请求体数据通常用于创建或更新资源时发送数据。在 Nest.js ,我们使用 @Body 装饰器来捕获请求体数据。...控制器方法返回值Nest.js 控制器方法可以返回各种不同类型值,这些值将作为 HTTP 响应返回给客户端。...使用 try-catch在控制器方法,您可以使用 try-catch 语句来捕获和处理异常。例如,如果在处理请求时发生了错误,您可以抛出一个异常,然后在 catch 子句中处理它。...使用异常过滤器除了在控制器方法内部使用 try-catch 外,Nest.js 还提供了异常过滤器,它可以全局处理应用程序异常。

34520

Nest.js 从零到壹系列(四):使用中间件、拦截器、过滤器打造日志系统

首先,一个良好服务端,应该有较完善日志收集功能,这样才能在生产环境发生异常时,能够从日志复盘,找出 Bug 所在。 其次,要针对项目中抛出异常进行归类,并将信息反映在接口或日志。...一、日志系统 这里使用是 log4js,前身是 log4j,如果有写过 Java 大佬应该不会陌生。...二、异常处理 在开发过程,难免会写出各式各样“八阿哥”,不然程序员就要失业了。一个富有爱心程序员应该在输出代码同时创造出3个岗位(手动狗头)。 ?...这样就会有隐患了,用户在使用过程中报错了,但是日志没有记录报错原因,就无法统计影响范围,如果是简单报错还好,如果涉及数据库各种事务或者并发问题,就很难追踪定位了,总不能一直看着控制台吧。...:数据库连接● Nest.js 从零到壹系列(三):使用 JWT 实现单点登录 ·END·

6.4K73

Nest.js 处理 XML 请求及响应

0x01 背景 笔者最近在使用 Nest.js 开发服务端程序,遇到了一些需要处理 XML 场景,搜遍了网络上发现没有比较优雅方式,于是摸索后将过程整理出来。...0x02 研究 Google 搜索 nest handle xml 第一个结果是一篇中文文章: Nest 处理 XML 类型请求与响应 但是照猫画虎了一番,发现 TS 总是报错,可能是 body-parser-xml...fast-xml-parser 即可将 XML 字符串转换成 JSON 串了~ 这样虽然也能使用了,但是解析 XML 操作还是要写在业务代码,就如上述代码 const parsed = xmlParser.parse...(body); 那么有没有更优雅方式呢?...答案是有的,这就要用到 Nest.js Custom Decorator 了 0x04 优化 首先新建一个 decorator,使用如下指令: nest g decorator xml nest

3.6K20
领券