系统中数据经常会进行新增或者更新,正常情况下如实保存就行,特殊情况下则需要对传进来的参数进行一些特殊的处理,比如说去掉前后空格或者去掉换行或者中间的若干个空格,来使数据更加严谨和准确,排除掉烂数据。...(还有一大部分原因就是测试的角度太刁钻) 所以经常会对每个参数进行单独处理,所以封装一个处理的工具类,简化数据处理过程。...Description: 处理参数内前后空格 * @date 2021/11/27 10:00 */ public class TrimStringUtil { /** * 替换Map中的...stringTrimDate(hashMap, typeReference, isInclude, Arrays.asList(keys)); } /** * 替换Map中的...* @param isInclude 是否包含keys中的字段 * @param keyList 字段枚举 * @return
数据传输目标往往是数据访问对象从数据库中检索数据。数据传输对象与数据交互对象或数据访问对象之间的差异是一个以不具有任何行为除了存储和检索的数据(访问和存取器)。...: 管道是具有 @Injectable() 装饰器的类。...管道有两个类型: 转换:管道将输入数据转换为所需的数据输出 验证:对输入数据进行验证,如果验证成功继续传递; 验证失败则抛出异常; 管道在异常区域内运行。...什么意思呢, 通俗来讲就是,对请求接口的入参进行验证和转换的前置操作,验证好了我才会将内容给到路由对应的方法中去,失败了就进入异常过滤器中。...(对参数类型进行验证,验证失败抛出异常)。
当 Node.js Server 项目越来越大时,将数据和数据库整理规范是很难的,所以从一开始就有一个好的开发和项目设置,对你的开发项目的成功至关重要。...因此,您在代码中更改了实体类, typeORM 会为你自动同步字段, 但是,一旦您的数据库中有实际数据,后期打算修改字段类型或其他操作时,TypeORM 将通过删除并重新创建数据库表来更改数据库,这意味着你极有可能丢失了表内的数据...幸运的是 TypeORM 提供了一个解决方案和 CLI 命令,它为你处理生成 SQL 命令的任务。然后,您可以轻松验证和测试这些,而无需在后台使用任何黑魔法。...为了演示,我将添加一个简单的 endpoint,它将返回表中的数据。 我们使用 Nest.js CLI 添加一个项目控制器和一个项目服务。...应用领域驱动设计原则的分离。 性能,更容易优化查询。 版本控制。 可测试性。...... 等等 因此,我们将添加一个 ItemDTO 响应类,该类将由数据库中的项目实体填充。
我举几个例子: 在 TypeORM 中,你需要 select 选择某个实体的几个字段,你可以这么写 你会发现 post 对象的类型提示依旧还是 postEntity,没有任何变化。...Schema 生成 zod 验证器**。...dto 类,就像下面这样 当然你可能并不想在 nestjs 项目中使用 zod,而是希望使用传统的 class-validator 来编写 dto。...在应用程序代码中,您可以使用 Prisma Client 以类型安全的方式读取和写入数据库中的数据,而无需管理复杂模型实例的开销。...总而言之,你若想要更好的类型,简洁的实体声明语法,况且带有可视化桌面端应用,以及更好的生态完备,那么你就应该选 Prisma。
Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。...Swagger 的目标是对 REST API 定义一个标准且和语言无关的接口,可以让人和计算机拥有无须访问源码、文档或网络流量监测就可以发现和理解服务的能力。...1 安装Swagger yarn add @nestjs/swagger swagger-ui-express --save 2 配置Swagger 需要在src目录下main.ts文件中配置及构建出口...(具有定义的HTTP路由),我们使用类的createDocument()方法SwaggerModule。...此方法带有两个参数,分别是应用程序实例和基本Swagger选项。
1.2 如何理解 DRY 原则 DRY 针对的是知识和意图的复制,强调多个地方表达的东西其实是相同的,只是表达方式不同。 Q:知识和意图 这两个词比较抽象,如果具体到编码,指代的什么呢?...理解误区: 有些人将 DRY 固化为编码规范,这是狭隘的。 至少,别把它理解为“不要复制粘贴代码”,它和你想的真的不一样。...使用 lib 包,可以封装实体类,甚至更进一步,把远程调用的代码也封装进来。...2.4.2 数据源的重复 实体类对数据表的定义和数据库实际的表结构存在重复。 推荐: 借助 orm 框架,自动实现对象和关系型数据库的映射。这是一种方式,但需要谨慎对待,数据问题无小事。...3 总结 DRY 原则描述的重复是 知识和意图 的重复。包含 代码重复、文档重复、数据重复、表征重复、开发人员重复。
,GraphQL 便会返回带有该字段的数据。...不仅需要在后端中配置 GraphQL 服务,用于接收 GraphQL 查询并验证和执行,此外前端通常需要 GraphQL 客户端,来方便使用 GraphQL 获取数据,目前实用比较多的是Apollo Graph...此外blog.entity.ts也不为数据库实体类,因此这里引入typeorm,并使用sqlite3 集成 Typeorm 安装依赖 pnpm install @nestjs/typeorm typeorm...警告 @nestjs/graphql 会将 typescript 的 number 类型视为 Float,所以需要转成 Int 类型,即 @Field(() => Int) 为 BlogService...(或在已有实体添加装饰器),不过本文案例中只演示了基本的 CRUD 操作,实际业务中还需要涉及鉴权,限流等等。
例如,一个电商应用可以分为用户模块、商品模块、订单模块等,每个模块都有自己的控制器、服务和实体,模块之间通过依赖注入进行交互。...2.面向对象编程(OOP)风格 借鉴了面向对象编程的思想,提供了类、接口、装饰器等特性,使得代码更加直观、易于理解和扩展。...例如,可以使用类来定义控制器、服务和实体,通过装饰器来添加元数据,提高代码的可读性和可维护性。 3.依赖注入 强大的依赖注入系统,使得模块之间的耦合度降低,提高了代码的可测试性和可维护性。...这使得开发人员可以根据项目的需求选择合适的技术栈,提高开发效率。 例如,如果需要高性能的服务器,可以选择使用 Fastify;如果需要更好的类型安全和开发体验,可以选择使用 TypeScript。...例如,可以使用 NestJS 的路由模块来定义 API 路由,使用验证模块来对输入数据进行验证,使用异常处理模块来统一处理应用程序中的异常。
NestJS中全局错误处理一、创建全局错误过滤器创建一个类来实现ExceptionFilter接口,用于处理全局错误。...错误日志在 NestJS 中可以添加错误日志来记录应用程序中的错误信息,以便于调试和故障排查。...NestJS参数校验 zod因为之前koa用的Joi,想找一个类似的。zod 是一个强大的类型安全和数据验证库。优点:提供了简洁直观的 API 来定义和验证数据结构。...Joi和zod都是 JavaScript 和 TypeScript 中常用的用于数据验证和校验的库,它们有一些相似之处,但也存在一些不同点:一、相似之处1.数据验证功能两者都可以对输入数据进行各种类型的验证...例如,都可以验证一个字符串是否为有效的电子邮件地址,或者一个数值是否在特定的范围内。2.链式调用语法Joi和zod都提供了一种链式调用的语法,使得可以方便地组合多个验证规则。
通过他我们可以定义一些Entity(实体),每个实体的数据字段,每个字段包含了数据类型,甚至是数据关系(一对多、多对多、多对一)。这些实体将映射到真实数据库中,创建真正的数据表。...logging:日志 entities:要加载并用于此连接的实体。接受要加载的实体类和目录路,值为一个数组。...现在我们来src/modules/pokemon目录下创建实体文件pokemon.entity.ts。TypeORM的基本方法了解: Entity:实体装饰器,将一个类声明为一个实体。...4.2、GraphQL基本方法说明与Schema声明 首先GraphQL常用的几个装饰器方法分别是: ObjectType:声明一个Schema(数据结构),对一个类进行装饰,用于声明这个Object的各个字段以及他们的类型...这个类声明了四个只读属性的字段,并且定义了输入的数据类型。
controllers 是控制器,包含 BbbController,providers 是提供商,有 service、factory 等类型,这里包含 BbbService,同时,还导出了 BbbService...Service 是可以被作为依赖注入到其他类的实例中去的,所以用 Injectable 装饰器。...reflect-metadata 模块是用于解析类的装饰器的,因为要给某个类的实例注入依赖就得能解析出它通过装饰器声明了哪些依赖,然后注入给它。所以要实现 IOC 需要依赖这个包。...Typeorm 和 Nest.js 的结合使用 @nestjs/typeorm 的包,它提供了一个 TypeormModule 的模块,有 forRoot 和 forFeature 两个静态方法。...Nest.js 有很多样板代码,可以用 @nestjs/cli 的命令行工具生成,包括整体的和每个 Module 的。
精读 《Nestjs 文档》 本期精读的文章是:Nestjs 文档 体验一下 nodejs mvc 框架的优雅设计。...2 内容概要 Nestjs 不是一个新轮子,它是基于 Express、socket.io 封装的 nodejs 后端开发框架,对 Typescript 开发者提供类型支持,也能优雅降级供 Js 使用,拥有诸多特性...3.1.1 定义实体 每个实体对应数据库的一张表,Typeorm 在每次启动都会同步表结构到数据库,我们完全不用使用数据库查看表结构,所有结构信息都定义在代码中: @Entity() export class...({ comment: '名称', length: 30, unique: true, }) name: string = 'nick'; } 通过 @Entity 将类定义为实体...res.status(HttpStatus.OK).json(card); } 3.1.3 外键 外键也是 Typeorm 的特色之一,通过装饰器语义化解释实体之间的关系,常用的有 @OneToOne
Swagger 是一组围绕 OpenAPI 规范构建的开源工具,可以帮助您设计、构建、记录和使用 REST API。...在 main.ts 文件中定义并初始化 SwaggerModule 类 import { NestFactory } from '@nestjs/core'; import { DocumentBuilder...指定请求需要携带 Bearer Token,用于身份验证 @ApiProperty 为 DTO 类型的属性添加元数据,如描述、默认值等 @ApiQuery 描述查询参数,包括名称、类型、描述等 @ApiHeader...描述请求头信息,包括名称、类型、描述等 @ApiExcludeEndpoint 标记一个控制器方法不在 Swagger UI 中显示 效果图 总结 在 Nest 中集成 Swagger 文档可以帮助开发者自动生成和维护...,每一个接口都需要保持注释和装饰器的准确性和完整性,仍然需要一定的维护工作。
从一开始没有模块系统,到之后出现几大类(AMD、CMD、CommonJS、ESM)下的多种模块系统,JavaScript的代码组织和管理变得渐渐规范起来。...模块的创建 NestJS模块可以通过在一个普通的类上添加@Modue装饰器声明来创建。...:功能模块与共享模块 在实际的软件程序中,一定会存在业务类代码和辅助工具类代码。...划分的原则还是以业务和非业务功能为基础,业务上相关联的代码(包括只在该业务中所使用的工具代码)尽量组织在同一个模块中;而和业务无关的、可被其他模块通用的代码,可以按功能分类组织在一个或多个模块之中。...@Module装饰器的参数选项都移除,然后在DemoModule模块类中定义一个静态方法register,该方法接受一个options参数(其实这里的方法名和参数名、参数个数都可以随你自己的需要来定,没有什么限制
- 重复的代码。我们可能还有其他的类,比如Audio或Picture,这些类可能也会使用类似的数据库、文件系统、和验证方法,我们应该怎么做呢?...这样分离有以下好处: - **DRY原则**。我们不需要再重复DB(文件)的逻辑,可以把任何实体(音乐、图片)传递给DB类,类会将他们保存到DB。 - 代码可读性更好,逻辑更简单。...没什么难的,让我们为每个形状创建一个类,每个类有不同的字段:大小、高度、宽度、半径和类型字段。当计算每个形状的面积时,我们使用类型字段来区分。...我们需要为他们中的每一个创建一个新的类,定义类型并在getTotalAreas中添加新的if/else。 **注意:** **O - 开闭原则**。...这个原则是指:如果S是T的子类型,那么程序中的T对象可以被S对象替换,不需要改变程序中任何所需属性。
4.为Book创建控制器和Index视图 按照第一节中的步骤,我们为Book模型创建一个控制器:在文件夹“Controllers”上面点击右键 > “添加” > “控制器”,在打开的添加控制器对话框中...在这个视图模板中,我们指定了强类型Book作为它的模型类,VS检查Book类,并根据Book类的属性,生成了对应的标签名和编辑框,我们修改标签名,使它显示中文,修改后的代码如下: @model MvcHelloworld.Models.Book...7.设置实体模型的数据验证 在ASP.NET MVC中,有一条作为核心的原则,就是DRY(“Don’t Repeat Yourself,中文意思为:不要让开发者重复做同样的事情,即“一处定义、处处可用...这样可以减少开发者的代码编写量,同时也更加便于代码的维护。 ASP.NET MVC与EF code-first提供的默认验证规则就是一个实现DRY原则的很好的例子。...对于实体的操作,还有更新、查看和删除操作,笔者不再一一讲解其步骤,只将控制器代码贴出,以供朋友们参照。视图的代码可以参考自动生成,稍作修改即可。
遗憾的是,同样的原则也能有效地使你的代码失效。 作为程序员,我们收集、组织、维护和利用知识。我们在规范中记载知识、在运行的代码中使其活跃起来并将其用于提供测试过程中所需的检查。 ...我们觉得,可靠地开发软件、并让我们的开发更易于理解和维护的惟一途径,是遵循我们称之为DRY的原则: 系统中的每一项知识都必须具有单一、无歧义、权威的表示。 我们为何称其为DRY?...许多语言会在源码中强加可观的重复。如果语言使模块的接口与其实现分离,就常常会出现这样的情况。C与C++有头文件,在其中重复了被导出变量、函数和(C++的)类的名称和类型信息。...,你可以因为性能原因而选择违反DRY原则。...这经常会发生在你需要缓存数据,以避免重复昂贵的操作时。其诀窍是使影响局部化。对DRY原则的违反没有暴露给外界:只有类中的方法需要注意“保持行为良好”。