[一期 - 1] 这可能是你看过最全的 「NestJS」 教程了 - 基础知识准备

lxf2023-12-31 02:50:01

本文概要和目录

接上节代码,我们已经构建了gitlab CI现在我们开始唠嗑唠嗑,偏向后端的知识 ,本章内容主要是向大家介绍Nestjs(一个类似于 Spring、 Angular 的Nodejs框架)的基础使用。为什么要去发这篇 这篇文章呢,主要是NestJS官方文档有点很多东西说的不是很明白,例子也比较少且不完整,于是我打算弄来个比较全面的解读,构建一个比较完整的后端应用,汰!开始

重要提醒!:请不要照着文章照抄,建议你先阅读通篇,了解全貌之后再去实践。

[一期 - 1] 这可能是你看过最全的 「NestJS」 教程了 - 基础知识准备

理论知识

起步

这个主要是介绍了如何安装NestJS的CLI 以及使用NestJSCLI构建一个最基础的NestJS应用。对于这个NestJS框架来说 ,正如官方所言: Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架。 它是一个功能比较全面的Nodejs后端框架,底层支持Express 和 Fastify。

⚠️在NestJS中OOP的思想很多,你需要好好的理解和学习他们

# 没有废话,直接上代码
$ npm i -g @nestjs/cli 
$ nest new project-name
我们启动文件在哪儿呢?它在main.js 
import { NestFactory } from '@nestjs/core';
import { NestExpressApplication } from '@nestjs/platform-express';
import { AppModule } from './app.module';


async function bootstrap() {
  // const app = await NestFactory.create(AppModule);  
  // 一般来说我们选择 NestExpress ,别问为什么 因为网上对这方面的资源多,出bug好找解决方案,而且官方文档有很多例子都是 Express来说的
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  await app.listen(3000);
}
bootstrap();

控制器 Controller

如果你对Spring有一定的了解,这个东西实际上和它非常的类型,其功能是 处理传入的请求和向客户端返回响应

理论知识

  • 什么样的东西能叫 Controller?如何使用 ? 被 @Controller 装饰的类 就是 一个 Controller ,在module中把它倒入到对应的controller中就能够使用它里,至于module是什么如何用我们下面详细展开说
// app.controller.ts
// @Controller(‘hello’) 当你访问3000/hello的时候你就能 导航 到这个controoler来了
@Controller()
export class AppController {
}

//app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],  // 这个就是哈 把 controller放在这个里面就好了 通过@Module 装饰器将元数据附加到模块类中 Nest 可以轻松反射(reflect)出哪些控制器(controller)必须被安装
  providers: [AppService],  // 这个我们暂且不管
})
export class AppModule {}

  • 如何获取HTTP过来的请求和返回去的Respose?
// 我们可以使用 @Get @Put @Post @Delete 来定义 请求类型。如果你给他传递了参数那么这个参数就是它的路径 如下
// 结合前面的代码,当我们使用get访问 3000/hello/nihao的时候就能得到 “你好” string的返回
  @Get(‘/nihao’)
  getHello(): string {
    return “你好”;
  }
  
// 上面是如何定义路径,如何定义请求方式,接下来我们看看请求参数的获取
// 1. 如何获取req 和res 对象,并且手动的设置值 cookie什么之类的
@Get("/getReq")
getReq( @Req() request: Request, @Res() response: Response ): any {
  console.log(request.headers);
  // 通过获取到ts的类型 我想你应该是理解这个对象的意义的 如果你调用了Req 和Res那么这个时候你就需要手动的res,sed()了,不推荐 如果你直接
  // 这样做将会导致 失去与依赖于 Nest 标准响应处理的 Nest 功能(例如,拦截器(Interceptors) 和 @HttpCode()/@Header() 装饰器)的兼容性
  // 要解决此问题,可以将 passthrough 选项设置为 true 比如下面的函数 “/getReq2” 这样就能兼容,你只定义了code 其它的定义依然交由Nest处理 比如下面