写点什么

Nest.js 初步学习

作者:木偶
  • 2022-10-30
    陕西
  • 本文字数:3515 字

    阅读完需:约 12 分钟

Nest.js初步学习

一.简介

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


在底层,Nest 构建在强大的 HTTP 服务器框架上,例如 Express (默认),并且还可以通过配置从而使用 Fastify !


Nest 在这些常见的 Node.js 框架 (Express/Fastify) 之上提高了一个抽象级别,但仍然向开发者直接暴露了底层框架的 API。这使得开发者可以自由地使用适用于底层平台的无数的第三方模块。

二.下载 nestjs

1.下载

(1).使用脚手架

npm i -g @nestjs/cli
复制代码

(2).git

$ git clone https://github.com/nestjs/typescript-starter.git project$ cd project$ npm install$ npm run start
复制代码

2.切换镜像源

如果下载速度慢或者下载过程中报错,建议使用如下代码切换镜像资源。


npm config set registry http://registry.npm.taobao.org/
复制代码


npm i g @nestjs/cli
复制代码

三.新建项目

nest new project-name
复制代码

四.平台

Nest 的目标是成为一个与平台无关的框架。平台独立性使创建可重用的逻辑部分成为可能,开发人员可以在多种不同类型的应用程序中利用这些逻辑部分。 从技术上讲,一旦创建了适配器,Nest 便可以使用任何 Node HTTP 框架。 目前支持两个 HTTP 平台:express 和 fastify。



无论使用那个平台,都会将平台的 application 接口暴露出来。它们分别是 NestExpressApplicationNestFastifyApplication


当您将类型信息传递给 NestFactory.create() 方法时,如下例所示,app 对象将具有该特定平台的专用方法。但是请注意,除非 您确实需要访问底层平台的 API,否则 无需 指定平台类型。


const app = await NestFactory.create<NestExpressApplication>(AppModule);
复制代码

五.运行

npm run start
复制代码

六.控制器

控制器负责处理传入的请求并将响应返回给客户端

1.创建控制器的装饰器 @Controller()

nest g controller name
复制代码


2.请求


请求对象表示 HTTP 请求,并具有请求查询字符串、参数、HTTP 标头和正文的属性。在大多数情况下,没有必要手动获取这些属性。我们可以使用开箱即用的专用装饰器,例如@Body()or 。@Query()下面是提供的装饰器列表以及它们所代表的普通平台特定对象。


(1).动态匹配

// 动态路由 使用Param进行获取// @Get(':csdnid')// gonews(@Param() params){//     return "id"+params.csdnid// }
复制代码

(2).模糊匹配

假设存在路由 adcda,name 我们可以用如下方法进行模糊匹配


// 模糊路由 使用a*a进行获取// @Get('a*a')// gonews(){//     return "模糊匹配"// }
复制代码

3.状态

默认状态为 200,我们可以使用**@HttpCode(number)**进行更改


@Post()@HttpCode(204)create() {  return 'This action adds a new cat';}
复制代码

4.重定向

要将响应重定向到特定 URL,可以使用@Redirect()装饰器或特定于库的响应对象(并res.redirect()直接调用)。@Redirect()接受一个必需url参数和一个可选statusCode参数。如果省略,则statusCode默认为302( )。

七.Providers(服务)

Providers 是 Nest 的一个基本概念。许多基本的 Nest 类可以被视为提供者——服务、存储库、工厂、助手等等。Providers 的主要思想是它可以注入依赖项;这意味着对象之间可以创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 Nest 运行时系统。

1.创建

nest g service name
复制代码

2.在其他模块使用

// 引入新服务import { UserService } from '../user/user.service';
复制代码


在 Nest 中,借助 TypeScript 功能,管理依赖关系非常容易,因为它们仅按类型解析。Nest 将`catsService`通过创建并返回一个实例来解决这个问题`CatsService`(或者,在单例的正常情况下,如果它已在其他地方请求,则返回现有实例)。此依赖项已解析并传递给控制器的构造函数(或分配给指定的属性)// 实例化constructor (private userserver:UserService){}
复制代码


 // @request 类似于express中的req@Get('demo')End(){    // 引用服务模块的方法    return this.userserver.findAll()}
复制代码

八.模块(@Module)

模块是一个用@Module()装饰器注解的类。@Module()装饰器提供了 Nest 用来组织应用程序结构的元数据。

装饰器采用@Module()单个对象,其属性描述模块:

可将模块中导出的提供程序视为模块的公共接口或 API

1.共享

在 Nest 中,模块默认是单例的,因此可以轻松地在多个模块之间共享任何提供程序的相同实例。

九.中间件(middleware)

nest g middleware name
复制代码


中间件是在路由处理程序之前调用的函数。中间件函数可以访问请求和响应对象,以及next()应用程序请求-响应周期中的中间件函数。下一个中间件函数通常由一个名为 的变量表示next


中间件函数可以执行以下任务:


  • 执行任何代码。

  • 更改请求和响应对象。

  • 结束请求-响应周期。

  • 调用堆栈中的下一个中间件函数。

  • 如果当前中间件函数没有结束请求-响应循环,它必须调用next()以将控制权传递给下一个中间件函数。否则,请求将被挂起。


在 APPmodule 中引入


// 中间件测试import { UserMiddleware } from './user.middleware';
复制代码


在 UserMiddleware 中


import { Injectable, NestMiddleware } from '@nestjs/common';
@Injectable()export class UserMiddleware implements NestMiddleware { use(req: any, res: any, next: () => void) { console.log('中间件'); next(); }}
复制代码


在 APPmodule 中引入


// 使用中间件export class AppModule implements NestModule {  configure(consumer: MiddlewareConsumer) {      consumer.apply(UserMiddleware).forRoutes('user')  }}
复制代码

1.apply()

apply()方法可以采用单个中间件,也可以采用多个参数来指定多个中间件。

2.configure()

configure()可以使用异步方法使方法(async/await,可以在方法主体await内完成异步操作)

3.不包括的中间件

有时候可以排除某些路由应用中间件,使用 exclude(),此方法可以采用单个字符串、多个字符串或一个RouteInfo标识路由的对象来排除


consumer  .apply(LoggerMiddleware)  .exclude(    { path: 'cats', method: RequestMethod.GET },    { path: 'cats', method: RequestMethod.POST },    'cats/(.*)',  )  .forRoutes(CatsController);
复制代码

4.多个中间件

在**apply()**使用逗号隔开


consumer.apply(cors(), helmet(), logger).forRoutes(CatsController);
复制代码

5.全局中间件

main.ts 中使用**app.use()**进行使用

十.Exception filters(异常过滤器)

Nest 带有一个内置的异常层,负责处理应用程序中所有未处理的异常。


开箱即用,此操作由内置的全局异常过滤器执行,该过滤器处理类型HttpException(及其子类)的异常。当异常无法识别(既不是HttpException也不是继承自的类HttpException)时,内置异常过滤器会生成以下默认 JSON 响应


{  "statusCode": 500,  "message": "Internal server error"}
复制代码

1.HttpException

它可以帮助我们抛出异常


HttpException构造函数接受两个确定响应的必需参数:


  • response参数定义 JSON 响应正文。它可以是 astring 或 a object,如下所述。

  • status参数定义 HTTP 状态代码。


默认情况下,JSON 响应正文包含两个属性:


  • statusCode: 默认为status参数中提供的 HTTP 状态码

  • message:基于 HTTP 错误的简短描述status


第二个构造函数参数 - status- 应该是一个有效的 HTTP 状态码。最佳做法是使用HttpStatus@nestjs/common.


mport { HttpException, HttpStatus, Injectable, NestMiddleware } from '@nestjs/common';import { NextFunction,Request,Response } from 'express';
@Injectable()export class UserService { findAll(){ throw new HttpException({ status:HttpStatus.FORBIDDEN, error:'测试错误异常' },HttpStatus.FORBIDDEN) }}
复制代码


2.内置 HTTP 异常

Nest 提供了一组从基础继承的标准异常HttpException。这些是从@nestjs/common包中公开的,代表了许多最常见的 HTTP 异常:


  • BadRequestException

  • UnauthorizedException

  • NotFoundException

  • ForbiddenException

  • NotAcceptableException

  • RequestTimeoutException

  • ConflictException

  • GoneException

  • HttpVersionNotSupportedException

  • PayloadTooLargeException

  • UnsupportedMediaTypeException

  • UnprocessableEntityException

  • InternalServerErrorException

  • NotImplementedException

  • ImATeapotException

  • MethodNotAllowedException

  • BadGatewayException

  • ServiceUnavailableException

  • GatewayTimeoutException

  • PreconditionFailedException

十一.管道(Pipes)

管道是一个用@Injectable()装饰器注解的类。管道应该实现PipeTransform接口。


发布于: 刚刚阅读数: 4
用户头像

木偶

关注

凭时间赢来的东西,时间肯定会为之作证 2022-10-21 加入

CSDN前端领域优质创作者,CSDN博客专家,擅长PC端以及Uniapp开发

评论

发布
暂无评论
Nest.js初步学习_Express_木偶_InfoQ写作社区