关于nestjs:从-0-实现-Nest-Entity-Provider-CLI

前言Nest CLI 提供了一系列命令,能够帮忙开发者疾速初始化新的 Nest.js 我的项目,生成模块、控制器和服务等。 nest g res user生成的模块如下所示: tree useruser├── dto│ ├── create-user.dto.ts│ └── update-user.dto.ts├── entities│ └── user.entity.ts├── user.controller.spec.ts├── user.controller.ts├── user.module.ts├── user.service.spec.ts└── user.service.ts尽管生成了 user.entity.ts,但此时与 user.module.ts 模块却没有任何关联。个别还须要开发者手动去定义 provider 而后在 user.module.ts 中引入。如下所示: // provider.factory.tstype ctor = { new (...args: any): object }export const ProviderFactory = (provide: string | ctor, repository: ctor) => { return { provide, useFactory: (dataSource: DataSource) => dataSource.getRepository(repository), // DATA_SOURCE 就是 databaseProvider的Key // 通过在 inject 指明 Provider 的 token,能够在 useFactory 中注入值 inject: [DATA_SOURCE], }}// user.provider.tsimport { USER_PROVIDER } from '../constants/user.constants'import { User } from '../entities/user.entity'import { ProviderFactory } from '../../utils/provider.factory'export const UserProvider = ProviderFactory(USER_PROVIDER, User)在 user.module.ts 中应用 ...

September 8, 2023 · 4 min · jiezi

关于nestjs:nestjs-v8x-如何快速实现redis连接

* 须要装置的包版本@chenjm/nestjs-redis * 新增moduleimport { Module } from "@nestjs/common";import redisconfig from "../constant/redis";import { RedisModule } from "@chenjm/nestjs-redis";import { RedisService } from "./redis.service";console.log("==================your redis config is=====================")console.log(redisconfig)@Module({ imports: [ RedisModule.forRoot({ closeClient: true, readyLog: true, config: { url: `redis://redis:${redisconfig.pass}@${redisconfig.host}:${redisconfig.port}/${redisconfig.db}`, } }) ], providers: [RedisService], exports: [RedisService]})export class Redismodel { }在以上代码中,如果redis设置了对于的名称,则须要将//后的redis替换为本人的redis名称。因为很多文档都年旧失修,然而对应的包版本又更新了很多版本,所以必须得看源码能力晓得正确的应用办法,这一点也是十分重要的! * 新增一个service办法import { Injectable } from "@nestjs/common";import { RedisService as redis } from '@chenjm/nestjs-redis';@Injectable()export class RedisService { client: any constructor(Redisservice: redis) { this.client = Redisservice.getClient() } async get(key: any) { return await this.client.get(key) }}你能够在此办法中实现redis原生的其余办法(set reset),以后demo中只展现了get。 ...

June 28, 2023 · 1 min · jiezi

关于nestjs:React18TSNestJSGraphQL-全栈开发在线教育平台

download:React18+TS+NestJS+GraphQL 全栈开发在线教育平台React 18 的重要更新和应用之新个性 React 18是最新版的React,它带来了很多新性能和改良。上面将具体介绍React 18的一些重要更新和应用之新个性。 服务器端渲染(SSR)更新React 18提供了一种新的服务器端渲染(SSR)框架,能够使开发人员更轻松地实现Web应用程序的SSR。这个新的框架包含反对异步渲染的新API,以及一个全新的“Server Components”模型,能够在客户端和服务器端上应用雷同的组件代码。 自适应渲染React 18引入了一种新的自适应渲染性能,能够依据设施和网络条件来动静调整Web应用程序的性能。这种自适应渲染能够通过启用“Concurrent Rendering”模式来实现,它容许React将渲染工作分成小块,并在必要时暂停或复原渲染。 交互式编辑器React 18还提供了一个交互式编辑器,能够让开发人员更轻松地创立和批改React代码。这个编辑器容许用户疾速预览组件,查看代码变动的成果,并实时调试应用程序。 更好的错误处理React 18改良了错误处理机制,能够更好地辨认和调试应用程序中的谬误。这个改良包含更好的谬误音讯、更好的堆栈跟踪和更好的开发工具反对。 更好的性能React 18引入了一些新的性能优化,包含更快的启动工夫、更少的内存占用和更快的渲染速度。这些性能晋升能够让React应用程序在各种设施和网络条件下更流畅地运行。 总结 React 18是一个重要的更新版本,它带来了很多新的性能和改良,包含服务器端渲染、自适应渲染、交互式编辑器、更好的错误处理和更好的性能。这些新个性能够使开发人员更轻松地构建高效、灵便和牢靠的Web应用程序,为React生态系统带来更多可能性和后劲。

May 22, 2023 · 1 min · jiezi

关于nestjs:React18TSNestJSGraphQL-全栈开发在线教育平台其中绰约多仙子

download:React18+TS+NestJS+GraphQL 全栈开发在线教育平台React18的新个性和改良 React是古代Web开发中最风行的JavaScript库之一。它的简略性、可组合性和性能使得它成为开发人员的首选。最近,React公布了18版,这个版本引入了一些令人兴奋的新个性和改良。在本文中,咱们将深入探讨React18的新性能。 Concurrent rendering React18引入了并发渲染,这是一个新的API,能够使React更加高效地解决大型应用程序。它通过容许React同时进行多个工作,从而进步了渲染速度。这意味着当用户与应用程序交互时,React能够更快地响应,提供更好的用户体验。 Automatic batching React18还引入了主动批处理,这是另一个能够进步渲染性能的重要性能。主动批处理能够将多个更新合并为单个更新,从而缩小了从新渲染的次数。这意味着React能够更好地治理多个工作,并且不会呈现性能问题。 New event system React18引入了全新的事件零碎,它更加直观、灵便和可扩大。新的事件零碎反对更多的事件类型和钩子函数,能够帮忙开发人员更好地管理应用程序的交互。此外,新的事件零碎还提供了更好的错误处理和调试反对。 Improved server rendering React18还改良了服务器渲染,使其更加容易和牢靠。新版提供了更好的错误处理,能够帮忙开发人员更轻松地调试应用程序。此外,React18还反对在服务器上渲染动静内容,从而进步了渲染性能。 总结 React18带来了一系列重要的新个性和改良,包含并发渲染、主动批处理、新的事件零碎和改良的服务器渲染等。这些性能能够进步React的性能和可靠性,为开发人员提供更好的开发体验。如果你是一名React开发人员,那么降级到React18相对是值得的。

May 22, 2023 · 1 min · jiezi

关于nestjs:NestJS入门到实战-前端必学服务端新趋势去来江口守空船

download:NestJS入门到实战 前端必学服务端新趋势岂无山歌与村笛乡音,乡情,乡愁回忆起童年时光,总会想起那些相熟的乡音和他乡的美好风景。在乡间小路上散步,听着村里孩子们欢快的笑声,远处传来一阵阵悠扬的山歌和村笛声,好像整个世界都变得舒适而平静。 “岂无山歌与村笛”,这句话出自唐代文学家白居易的《赋得古原草送别》,他用这句话表白了对故土和自然风景的思念和珍视。在古代社会中,随着城市化过程的减速,越来越多的人来到故土,很难再感触到那种纯洁而淳厚的乡土风情。然而,咱们依然能够通过观赏山歌和村笛等传统乡音来回味和缅怀故土的美好记忆。 山歌和村笛作为中国传统民间音乐的代表,具备浓烈的民族特色和地区文化气味。山歌是一种以口传心授的歌曲,它经常采纳他乡方言演唱,旋律优美而悠扬。村笛则是农村地区流传的管乐器,经常被用来伴奏山歌或者独自演奏。这些音乐不仅蕴含了人们对天然、生存和情感的了解和表白,同时也是一种文化遗产和民族精力的象征。 在古代社会中,随着经济的倒退和城市化过程的减速,越来越多的年轻人来到故土,到城市中谋求更好的生存和倒退机会。然而,咱们也应该保留和弘扬传统的民间文化,包含山歌和村笛等乡土音乐。只有这样,咱们能力真正珍惜和传承咱们的文化遗产,让更多人理解和观赏这些美好的音乐,感触到故土的舒适与亲切。 总之,“岂无山歌与村笛”这句话,揭示咱们要珍视传统的乡音和文化,寻找本人的根,回归心田的淳厚和天然的纯洁。无论是在哪里,只有咱们心中依然有故土的乡音和乡情,就能够感到一份舒适、温和和安定。

May 14, 2023 · 1 min · jiezi

关于nestjs:NestJS全栈进阶后台管理系统搭建TypeOrm使用值得学习

前言技术千千万,学习永一直;尽管是咸鱼,也想努把力!!! 这段时间始终很迷茫,做前端这行也有6年了,眼看马上奔三的人了,但仍旧是个菜逼,终日代码写了不少,但总感觉短少些什么,始终都没什么提高;每下定决心筹备积淀下本人,过不了几天人又变懒了;这不新一轮的积淀开始了,本次钻研基于NodeJS搭建一套实用的后盾管理系统。 我的项目地址:github、gitee为什么不抉择学习新后端语言如果重新学习一门后端语言,学习老本过高,再加上就算初步学会了,没有实战的机会,过不了多久就会忘掉。数据库常识还没把握好,这时再学习新语言,精力不够。这一点才是最重要的,后面的都是借口,人太笨,理解能力太差了,放心本人学废。为什么抉择NestJS基于JavaSript,不须要重新学习新语言。Nest (NestJS) 是一个用于构建高效、可扩大的 Node.js 服务器端应用程序的开发框架。它利用JavaScript 的渐进加强的能力,应用并齐全反对 TypeScript用的人多,遇到问题好查问。开始前的筹备肯定的JavaScript、TypeScript根底Redis装置(在本我的项目中,只用来了单点登录)MySQL的装置,网上的教程有很多,这里就不多赘述了(我本地是装置在docker,方便管理)Nodejs & npm :配置本地开发环境,装置 Node 后你会发现 npm 也会一起装置下来 (V12+)ps:mysql装置好后,手动新建一个名为"nest_admin"的数据库,前面的表创立就交给代码实现性能[X] JWT登录注册[X] 单点登录拦挡[X] 权限接口拦挡[X] 分页逻辑封装[X] 日志监控零碎[X] Swagger API接入、文档生成[ ] 文件本地上传、云端上传[ ] Nest微服务搭建我的项目构造├── config # 我的项目配置信息(数据库,redis,全局变量)├── src ├── auth # 权限治理模块(登录认证,接口权限拦挡) │   └── dto # swagger文档 ├── cache # Redis缓存工具包 ├── core │   ├── filter # 申请谬误拦挡 │   │   ├── any-exception │   │   └── http-exception │   └── interceptor # 申请胜利拦挡 │       └── transform ├── menu # 菜单治理模块 │   ├── dto │   └── entities # 数据库表实体 │   └── menu.controller.ts # 控制器(接口定义) │   └── menu.service.ts # 接口业务逻辑实现 ├── middleware # 拜访日志 │   └── logger ├── organization # 组织治理模块 ├── role # 权限治理模块 ├── user # 用户治理模块 └── utils # 工具包启动我的项目ps:启动项目前请确保mysql,redis已启动# clone$ git clone https://github.com/sunshine824/Nestjs-Cli-Serve.git# install$ npm install# development$ npm run start# watch mode$ npm run start:dev# production mode$ npm run start:prodswagger启动我的项目之后,swagger拜访地址:http://localhost:9080/docs ...

January 30, 2023 · 1 min · jiezi

关于nestjs:NestJS学习记录第一天

NestJS学习记录第一天哲学近年来,Node.js和JavaScript曾经成为web前端和后端利用的“通用开发语言”。这导致了Angular、React、Vue等优良我的项目的呈现,这些我的项目进步了开发者的生产力,能够创立疾速、可测试、可扩大的前端利用。然而,只管Node(以及服务器端JavaScript)领有大量优良的软件库、辅助程序和工具,但它们都无奈无效解决咱们面临的次要问题,即架构。 Nest提供了开箱即用的应用程序架构,容许开发人员及其团队创立高度可测试、可扩大、涣散耦合且易于保护的应用程序。这个修建的灵感来自于棱角分明的。第一步在这一组文章中, 您将学习到 Nest 的外围基本原理。为了理解根本的 Nest 应用程序构建模块,咱们将构建一个根本的涵盖了大量根底性能的 CRUD 应用程序。 语言咱们爱上了 TypeScript,但最重要的是,咱们喜爱 Node.js。 这就是为什么 Nest 兼容 TypeScript 和纯 JavaScript。 Nest 默认基于最新的语言个性,要在 Nest 中应用原生的 JavaScript 框架,咱们须要一个 Babel 编译器。 在文档示例中,咱们次要应用 TypeScript ,但您始终能够将代码片段切换为一般 JavaScript 语法 (只需单击每个片段右上角的 language 按钮即可切换)。 【译者注:中文文档暂不反对 language 切换】 先决条件请确保您的操作系统上装置了 Node.js(>= 10.13.0, v13 版本除外)。 一分钟装置 node.js (反对 X86 ARM MIPS 等架构,须要版本治理或者零碎为 Raspbian 请间接看 NVM) 其余装置形式或者,应用 Git 装置采纳 TypeScript 开发的 starter 我的项目: $ git clone https://github.com/nestjs/typescript-starter.git project$ cd project$ npm install$ npm run start关上浏览器并导航到 http://localhost:3000/ 地址。 ...

November 3, 2022 · 1 min · jiezi

关于nestjs:NestJS-校验数据类型

记录当NestJS的body申请体是数组对象时,dto的应用: dto.ts: import { IsNumber, Min, IsNotEmpty, IsOptional, IsString } from 'class-validator';export class UserDto { @IsNotEmpty() @IsString() readonly name!: string; @IsNotEmpty() @IsNumber() @Min(0) readonly age!: number; @IsNotEmpty() @IsString() readonly city!: string; @IsOptional() @IsString() readonly description?: string;}controller.ts import { UserDto } from "./dto";import { Controller, Post, Body, ParseArrayPipe} from "@nestjs/common";@Controller("/")export class TestController { @Post("test/dto") public async userInfo( @Body( new ParseArrayPipe({ items: UserDto, })) data: UserDto[] ) { return 'request success' }} 成果:error: ...

June 10, 2022 · 1 min · jiezi

关于nestjs:NestJS学习总结篇

原文链接 http://blog.poetries.top/2022... Nest (NestJS) 是一个用于构建高效、可扩大的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进加强的能力,应用并齐全反对 TypeScript (依然容许开发者应用纯 JavaScript 进行开发),并联合了 OOP (面向对象编程)、FP (函数式编程)和 FRP (函数响应式编程)。 在底层,Nest 构建在弱小的 HTTP 服务器框架上,例如 Express (默认),并且还能够通过配置从而应用 Fastify !Nest 在这些常见的 Node.js 框架 (Express/Fastify) 之上进步了一个形象级别,但依然向开发者间接裸露了底层框架的 API。这使得开发者能够自在地应用实用于底层平台的有数的第三方模块。本文基于nest8演示 根底创立我的项目$ npm i -g @nestjs/clinest new project-name 创立一个我的项目 $ tree.├── README.md├── nest-cli.json├── package.json├── src│ ├── app.controller.spec.ts│ ├── app.controller.ts│ ├── app.module.ts│ ├── app.service.ts│ └── main.ts├── test│ ├── app.e2e-spec.ts│ └── jest-e2e.json├── tsconfig.build.json└── tsconfig.json2 directories, 12 files以下是这些外围文件的简要概述: app.controller.ts 带有单个路由的根本控制器示例。app.module.ts 应用程序的根模块。main.ts 应用程序入口文件。它应用 NestFactory 用来创立 Nest 利用实例。main.ts 蕴含一个异步函数,它负责疏导咱们的应用程序:import { NestFactory } from '@nestjs/core';import { ApplicationModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(ApplicationModule); await app.listen(3000);}bootstrap();NestFactory 裸露了一些静态方法用于创立利用实例create() 办法返回一个实现 INestApplication 接口的对象, 并提供一组可用的办法nest有两个反对开箱即用的 HTTP 平台:express 和 fastify。 您能够抉择最适宜您需要的产品platform-express Express 是一个家喻户晓的 node.js 简洁 Web 框架。 这是一个通过实战考验,实用于生产的库,领有大量社区资源。 默认状况下应用 @nestjs/platform-express 包。 许多用户都能够应用 Express ,并且无需采取任何操作即可启用它。platform-fastify Fastify 是一个高性能,低开销的框架,专一于提供最高的效率和速度。Nest控制器Nest中的控制器层负责解决传入的申请, 并返回对客户端的响应。 ...

May 27, 2022 · 54 min · jiezi

关于nestjs:nestjs遇到问题如何在webstorm进行调试

在开发过程中,常常须要log进去咱们的数据查看。而像node程序终端log进去的数据不具备良好的可读性,所以能不能像浏览器调试一样浏览呢。 顶部菜单找到 RUN 接着抉择 Edit Configurations 会弹出一个窗口 接着点击 + 号,抉择 Node.js 接着参考上面图片,将 Node parameters 和 Javascript file 的参数批改为对应的数值。

April 18, 2022 · 1 min · jiezi

关于nestjs:NestJS搭建前端路由服务

背景通常,为了更好地治理和保护我的项目,我的项目个别都会以业务领域进行拆分,比方商品、订单、会员等等,从而产生业务职责不同的泛滥前端工程(SPA,单页面利用)。假如当初有个需要,所有的前端工程都须要接入神策埋点Web JS SDK,如果采纳每个前端工程动态页面index.html各自引入Web JS SDK的计划,那么每个工程引入之后都须要重新部署一遍,并且当前须要更换第三方埋点SDK时,后面步骤须要从新来一遍,相当麻烦。而如果在拜访所有前端工程后面加一个路由转发层,有点像前端网关,拦挡响应,对立引入Web JS SDK。 七牛云模仿理论我的项目对象存储服务前端我的项目都会部署到对象存储服务中,比方阿里云对象存储服务OSS,华为云对象存储服务OBS,这儿我应用七牛云对象存储服务模仿理论的部署环境 一、创立存储空间,创立三级动态资源目录www/cassmall/inquiry,而后上传一个index.html模仿理论我的项目部署 二、给存储空间配置源站域名和CDN域名(理论配置须要先给域名备案),申请index.html应用源站域名,申请js、css、img等动态资源应用CDN域名 这里解释一下为什么到源站获取index.html,而不是通过CDN域名获取?假如通过CDN获取index.html,当第一次部署单页面利用,假如浏览器拜访http://localhost:3000/mall/inquiry/#/xxx,CDN上没有index.html则去源站拉取index.html,而后CDN缓存一份;当对index.html做了批改,第二次部署(部署到源站),浏览器还是拜访http://localhost:3000/mall/inquiry/#/xxx,发现CDN上曾经有index.html(旧),间接返回给浏览器,而不是返回源站最新的index.html,毕竟申请index.html的门路版本号参数,会走CDN。如果间接应用源站域名申请index.html,那么每次获取到的都是最新index.html。 其实,通过CDN域名获取index.html也能够,不过须要设置CDN缓存配置,让其对html后缀的文件不做缓存解决。 另外,js、css、img、video这类动态资源咱们心愿页面可能疾速加载,因而通过CDN减速获取。js、css可能改变比拟频繁,但在构建后都会依据内容生成hash重新命名文件,若文件有更改,其hash也会变动,申请时不会命中CDN缓存,会回源;若文件没有更改,其hash不会变动,则会命中CDN缓存。img、video改变不会很频繁,如须要改变,则重新命名上传即可,避免同样名称命中CDN缓存。 我的项目创立首先确定你曾经装置了Node.js, Node.js 装置会附带npx和一个npm 包运行程序。请确保在您的操作系统上装置了Node.js (>= 10.13.0,v13 除外)。要创立新的Nest.js 应用程序,请在终端上运行以下命令: npm i -g @nestjs/cli // 全局装置Nestnest new web-node-router-serve // 创立我的项目执行完创立我的项目, 会初始化上面这些文件, 并且询问你要是有什么形式来治理依赖包: 如果你有装置yarn,能够抉择yarn,能更快一些,npm在国内装置速度会慢一些 接下来依照提醒运行我的项目: 我的项目构造进入我的项目,看到的目录构造应该是这样的: 这里简略阐明一下这些外围文件: src├── app.controller.spec.ts├── app.controller.ts├── app.module.ts├── app.service.ts├── main.tsapp.controller.ts单个路由的根本控制器(Controller)app.controller.spec.ts针对控制器的单元测试app.module.ts应用程序的根模块(Module)app.service.ts具备繁多办法的根本服务(Service)main.ts应用程序的入口文件,它应用外围函数 NestFactory 来创立 Nest 应用程序的实例。main.ts 文件中蕴含了一个异步函数,此函数将 疏导(bootstrap) 应用程序的启动过程: import { NestFactory } from '@nestjs/core';import { AppModule } from './app.module';async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000);}bootstrap();要创立一个 Nest 应用程序的实例,咱们应用了 NestFactory 外围类。NestFactory 裸露了一些静态方法用于创立应用程序的实例。其中,create() 办法返回一个应用程序的对象,该对象实现了 INestApplication 接口。在下面的 main.ts 示例中,咱们仅启动了 HTTP 侦听器,该侦听器使应用程序能够侦听入栈的 HTTP 申请。 ...

February 12, 2022 · 4 min · jiezi

关于nestjs:在NestJS-中添加对Shopify-的WebHook-验证

怎么增加对Shopify 的WebHook 验证背景介绍Shopify 是一家一站式SaaS 模式的电商服务平台,总部位于加拿大首都渥太华,专一于为跨境电商用户提供海内品牌建设及销售渠道治理。为电商卖家提供搭建网店的技术和模版,治理全渠道的营销、售卖、领取、物流等服务。 代码实现Koa如果你是想在Koa 中对接Shopify, 则能够参照上面的做法: // 这是你从Shopify 上失去的接口校验密钥const secret = 'xxxx';const app = new Koa();async function run() { // 其余的中间件的应用 / app.use... app.use(async (ctx, next) => { const isShopify = ctx.request.path.startsWith('设置在Shopify 上的WebHook url'); if (!isShopify) { return koaBody({ multipart: true, formidable: { maxFileSize: 2000 * 1024 * 1024, // 设置上传文件大小最大限度,默认2M }, })(ctx, next); } else { let str = ''; await new Promise((resolve, reject) => { try { ctx.req.on('data', function(data: string) { str += data; }); ctx.req.on('end', function(chunk: string) { resolve(str); }); } catch (e) { str = '{}'; reject(e); } }); const buf = Buffer.from(str); const hash = crypto.createHmac('sha256', secret).update(buf).digest('base64'); const isOK = hash === ctx.request.headers['x-shopify-hmac-sha256']; ctx.request.body = JSON.parse(str); if (!isOK) { ctx.status = 403; ctx.body = 'Forbidden'; return; } return await next(); } })Nest如果你是想在Nest 中对接Shopify, 则能够参照上面这篇文章进行后期设置: ...

July 8, 2021 · 1 min · jiezi

关于nestjs:在NestJS-中添加对Stripe-的WebHook-验证

在NestJS 中增加对Stripe 的WebHook 验证背景介绍Nest 是一个用于构建高效,可扩大的NodeJS 服务器端应用程序的框架。它应用渐进式JavaScript, 内置并齐全反对TypeScript, 但依然容许开发人员应用纯JavaScript 编写代码。并联合了OOP(面向对象编程),FP(函数式编程)和 FRP(函数式响应编程)的元素。 Stripe 是一家美国金融服务和软件即服务公司,总部位于美国加利福尼亚州旧金山。次要提供用于电子商务网站和挪动应用程序的领取处理软件和应用程序编程接口。2020年8月4日,《苏州高新区 · 2020胡润寰球独角兽榜》公布,Stripe 排名第5位。 注:接下来的内容须要有NodeJS 及NestJS 的应用教训,如果没有须要另外学习如何应用。 代码实现1. 去除自带的Http Body Parser.因为Nest 默认会将所有申请的后果在外部间接转换成JavaScript 对象,这在个别状况下是很不便的,但如果咱们要对响应的内容进行自定义的验证的话就会有问题了,所以咱们要先替换成自定义的。 首先,在根入口启动利用时传入参数禁用掉自带的Parser. import {NestFactory} from '@nestjs/core';import {ExpressAdapter, NestExpressApplication} from '@nestjs/platform-express';// 利用根import {AppModule} from '@app/app/app.module';// 禁用bodyParserconst app = await NestFactory.create<NestExpressApplication>( AppModule, new ExpressAdapter(), {cors: true, bodyParser: false},);2. Parser 中间件而后定义三个不同的中间件: 给Stripe 用的Parser// raw-body.middleware.tsimport {Injectable, NestMiddleware} from '@nestjs/common';import {Request, Response} from 'express';import * as bodyParser from 'body-parser';@Injectable()export class RawBodyMiddleware implements NestMiddleware { use(req: Request, res: Response, next: () => any) { bodyParser.raw({type: '*/*'})(req, res, next); }}// raw-body-parser.middleware.tsimport {Injectable, NestMiddleware} from '@nestjs/common';import {Request, Response} from 'express';@Injectable()export class RawBodyParserMiddleware implements NestMiddleware { use(req: Request, res: Response, next: () => any) { req['rawBody'] = req.body; req.body = JSON.parse(req.body.toString()); next(); }}给其余中央用的一般的Parser// json-body.middleware.tsimport {Request, Response} from 'express';import * as bodyParser from 'body-parser';import {Injectable, NestMiddleware} from '@nestjs/common';@Injectable()export class JsonBodyMiddleware implements NestMiddleware { use(req: Request, res: Response, next: () => any) { bodyParser.json()(req, res, next); }}基于下面的两个不同的场景,在根App 外面给注入进去: ...

July 6, 2021 · 2 min · jiezi

关于nestjs:nest中常用的swagger写法

nest应用中,除了在DTO中应用class-validator去做校验。 还能够去写swagger文档。 在nest的controller写法中,代码如下 //person.controller.ts@Post()async create(@Body() person: PersonDTO): Promise<Person> { return ....}SwaggerModule会查找到@Body这个装璜器来生成API文档。同样的装璜器还有@Query,@Param。至于详尽的api阐明都是从PersonDTO中解析进去。 能够查阅中文文档链接 上面是一些罕用的装璜器 ApiProperty参数阐明 type 类型required 是否必须description 形容default 默认值name 属性名称,默认是装璜器润饰的属性名,然而显性的设置name文档中依照这个name的value为最终输出值typeDTO的写法 class PersonDTO { name: string; app: number; //或者 links: string[]// 数组 }这是ts的写法 而ApiProperty反对的Type有String,Number,Function,以及数组[String] 数组的写法就是这样,肯定要在type属性申明为[type]或者设置isArray属性为true ApiBodyTypeScript 不会存储无关泛型或接口的元数据. 须要应用ApiBody显性设置类型。 对于没用参数装璜器三兄弟的,又须要写文档的,就用ApiBody制订一个DTO @ApiBody({ type: [CreateUserDto] })createBulk(@Body() usersDto: CreateUserDto[])设置可选 ApiPropertyOptionalApiProperty默认是必填的,如果冀望是选填的。 能够应用ApiPropertyOptional来代替。能够不须要去{required: false}了 ApiPropertyOptional其它参数参考ApiProperty. 返回可选的装璜器 PartialType()对于create操作,所有的参数可能都是必填。 而对于update操作,只须要更新局部操作。 通过PartialType能够返回一个所有输出都是可选的参数 export class UpdatePersonDto extends PartialType(CreatePersonDto) {}在更新的Controller应用这个CreatePersonDto就能够了。 我在写本地demo的时候,发现PartialType在@nest/swagger下不存在。如果你也有这个问题,须要降级swagger这个包。~~~~more PickType()性能从一个输出类型中抉择一部分属性来创立一个新类型(类) 重点是抉择一部分 class PersonDTO { @ApiProperty({ message: '', type: String, }) name: string; @ApiProperty({ message: '', type: String, }) hintText: string; ...}咱们只须要hintText与name ...

September 28, 2020 · 1 min · jiezi

关于nestjs:classvalidator随笔

class-validator源码地址 通过自定义一个全局的validation pipe,联合class-validator来做参数校验。 nest官网对class-validator一笔带过。本篇整顿一些罕用的办法。 dto须要自行理解dto 罕用的IsDefined字符串类型的判断IsNumberString字符串"1",能够符合条件。数字1却不行。 留神,谬误的message要这么传入 @IsNumberString({},{message: '....'})IsBooleanString有了上边的教训,"true",'false'能够通过判断 IsDateString合乎日期类型的字符串 字符串类型Contains传入的字符串蕴含制订的字符串么 @Contains('test'),蕴含test通过。不蕴含,抛出异样。 message为第二个入参数。 NotContains与上相同 IsUppercase是否都是大写 IsLowercase小写 IsMobilePhone是否是手机号 你须要这样应用 @IsMobilePhone('zh-cn'),看懂了吗,须要传一个locate。 @Length(min: number, max?: number)测验字符串长度的。留神一下跟int的不同 MaxLength &&& MinLength这个很简略,间接 @MaxLength(12) Matches应用时,第一个参数是一个正则,合乎该正则通过。 @Matches(/foo/i) IsJson输出的字符串是个JSON格局的 相干的装璜器办法太多了,以上是字符串罕用的。有须要的能够去文档中查找。类库也反对自定义对应的装璜器。 Number相干IsDivisibleByIsDivisibleBy(5),被校验的参数能被5 整除。 IsPositive & IsNegative@IsPositive()负数 @IsNegative()正数 Max & Min数字最大最小值。 对于字符串判断MaxLength,MinLength,Number应用的是Max和Min 日期MaxDate最大日期 MinDate最小日期 留神,入参应该是日期类型才能够判断。如果入参是字符串类型,能够是用IsDateString来判断 类型判断的装璜器IsString是string类型 IsDate必须是Date类型了 IsNumberNumber类型就能够 IsInt整数通过 IsArray必须是数组 IsEnum(entity: object)IsObject判断是否是一个对象 IsNotEmptyObject()不是空对象 罕用校验器IsDefined不能等于null或者undefined 空字符串能够的 IsOptional 罕用可选的。如果输出的等于null或者undefined,疏忽其它的校验装璜器 Equals等于某个确定的值 @Equals(5) NotEquals不等于某个值 IsEmpty查看这个值等于'',null,undefined。 IsNotEmpty不能是空的,也就是不能是'',undefined,null IsIn查看值是否是数组中的某个值 @IsIn(['1','2'])输出的值必须是1,2中的一个值。 IsNotIn校验的值不能是给定的数组中的元素 @IsIn(['1','2'])再去校验1或者2就通不过了。 更多,浏览这里 ...

September 25, 2020 · 1 min · jiezi

关于nestjs:VUE3来了你用了NestJS了吗一

VUE3开发曾经进入了序幕,行将在8月底正式亮相,好多同学直呼学不动了,前端越来越大,曾经不单单是做个前端。前端要做的太多,再加上微信小程序、APP混合开发、NativeAPP、Electron等等,前端的工作曾经不简略是做PC页面和交互。当初又衰亡的flutter更是让很多人爱恨交加 吐槽归吐槽,还是得学,不然会被后浪拍死在沙滩上 Node.js曾经在很多小利用应用起来,目前根本应用都是javascript依附于ES(X)规范,express、koa是咱们应用的后端开发利用框架,前面用到VUE3做开发,用上了TS,预计很多同学还没怎么用过这个框架 NestJS爱上了Typescript,咱们应用这个兼容 TypeScript 和纯 JavaScript的框架。利用最新的语言性能,所以要应用原生的 JavaScript 框架,咱们须要一个 Babel 编译器。 装置过程啥的自行百度,这点小事儿难不倒咱技术人儿 创立一个我的项目npm $ npm i -g @nestjs/cli$ nest new project-nameyarn $ yarn global add @nestjs/cli$ nest new project-name创立完我的项目,有这些文件 src├── app.controller.ts // 带有单个路由的根本控制器示例├── app.module.ts // 应用程序的根模块└── main.ts // 应用程序入口文件。它应用NestFactory用来创立 Nest 利用实例main.ts蕴含一个异步函数,它负责疏导咱们的应用程序 import { NestFactory } from '@nestjs/core';import { ApplicationModule } from './app.module';async function bootstrap() { const app = await NestFactory.create(ApplicationModule); await app.listen(3000);}bootstrap();应用NestFactory外围类,裸露一些静态方法用于创立利用实例。create()办法返回一个实现INestApplication接口的对象, 并提供一组可用的办法。在下面的main.ts示例中,咱们只是启动 HTTP 服务器,它容许应用程序期待入站 HTTP 申请 ...

August 12, 2020 · 1 min · jiezi

NestJs学习之旅3服务提供者

欢迎持续关注NestJs之旅系列文章 简介服务提供者是NestJs一个非常重要的概念,一般来说,被装饰器@Injectable()修饰的类都可以视为服务提供者。服务提供者一般包含以下几种: Services(业务逻辑)Factory(用来创建提供者)Repository(数据库访问使用)Utils(工具函数)使用下文中将以Services来说明服务提供者的具体使用。 典型的MVC架构中其实有一个问题,业务逻辑到底放哪里? 放在控制器,代码复用成了问题,不可能去New一个控制器然后调用方法,控制器方法都是根据路由地址绑定的放在Model,导致Model层臃肿,Model应该是直接和数据库打交道的,业务逻辑跟数据库的关系并不是强制绑定的,只有业务逻辑涉及到数据查询/存储才会使用到Model层现阶段比较流行的架构是多添加一个Services层来写业务逻辑,分离Model层不应该做的事情。 // 业务类 user.service.ts@Injectable()export class UserServices { private readonly users: User[] = []; create(user: User) { this.users.push(user); } findAll(): User[] { return this.users; }}// 用户控制器@Controller('users')export class UserController { constructor(private readonly userService: UserService) {} // 注入UserService @Post() async create(@Body() createUserDTO:CreateUserDTO) { this.userService.create(createUserDTO); } @Get() async findAll() { return this.userService.findAll(); }}服务提供者的ScopeSpringBoot中提供了Scope注解来指明Bean的作用域,NestJs也提供了类似的@Scope()装饰器: scope名称说明SINGLETON单例模式,整个应用内只存在一份实例REQUEST每个请求初始化一次TRANSIENT每次注入都会实例化@Injectable({scope: Scope.REQUEST})export class UserService {}可选的依赖项默认情况下,如果依赖注入的对象不存在会提示错误,中断应用运行,此时可以使用@Optional()来指明选择性注入,但依赖注入的对象不存在时不会发生错误。 @Controller('users')export class UserController { constructor(@Optional() private readonly userService:UserService){}}基于属性的注入上文中的注入都是基于构造函数的,这样做有一个缺陷,如果涉及到继承的话,子类必须显示调用super来实例化父类。如果父类的构造函数参数过多的话反而成了子类的负担。 ...

August 21, 2019 · 2 min · jiezi

NestJs学习之旅1快速开始

经过NodeJs系列课程和Typescript系列课程,终于开始了激动人心的NestJs学习之旅。 欢迎持续关注NestJs之旅系列文章 介绍Nest(或NestJS)是一个用于构建高效,可扩展的Node.js服务器端应用程序的框架。它使用渐进式JavaScript,内置并完全支持TypeScript(但仍然允许开发人员使用纯JavaScript编写代码)并结合了OOP(面向对象编程),FP(功能编程)和FRP(功能反应编程)的元素。 import { Controller, Get } from '@nestjs/common';@Controller('cats')export class CatsController { @Get() findAll(): string { return 'This action returns all cats'; }}熟悉Java的同学应该有似曾相识的感觉,SpringBoot中大量使用注解来简化开发。现在,使用基于ES6装饰器构建的NestJs框架,你也可以做到! 优缺点先说说优点吧: 完美支持Typescript,因此可以使用日益繁荣的TS生态资源兼容express中间件,降低造轮子成本完美支持响应式编程框架rxjs完美支持依赖注入模块化思想,方便开发以及后期维护使用装饰器简化开发,减少样板代码组件化设计,解决Node.js无全栈框架约束的现存问题当然,"缺点"也是有点的,不过熟练之后这些都不是缺点: 基于TS导致的语言门槛代码设计上对模块化/组件化思想有一定要求第一个NestJs应用使用NestJs的命令行工具,可以简化项目的创建以及项目文件的创建。 npm install -g @nestjs/cli安装命令行工具nest new 项目名称初始化项目初始化完毕后可以看到一个完整的项目结果,目录如下(忽略node_modules): ├── README.md 自述文件├── nest-cli.json NestJs项目配置├── package.json npm文件├── src 项目源码│   ├── app.controller.spec.ts 控制器测试文件│   ├── app.controller.ts 控制器类│   ├── app.module.ts 模块类│   ├── app.service.ts 服务类│   └── main.ts 项目入口文件├── test 测试目录│   ├── app.e2e-spec.ts 应用e2e测试│   └── jest-e2e.json jest e2e测试配置├── tsconfig.build.json 生产环境Typescript所用├── tsconfig.json 开发环境Typescript配置├── tslint.json tslint配置└── yarn.lock yarn锁文件NestJs有几大类文件是主要的是下面几种,其他类型的文件在后续课程会讲解; ...

August 19, 2019 · 1 min · jiezi