学习NestJs的第一天

81 阅读3分钟

安装

npm i -g @nestjs/cli

创建一个NestJS应用

  nest new project-name
  #or
  nest new

根据喜好选择一个包管理工具 npm、yarn、pnpm

等待依赖安装项目构建

运行项目

npm run start

如果需要在修改代码之后自动重新构建项目执行

npm run start:dev

默认服务在3000端口,打开浏览器在地址栏输入 localhost:3000 就可以看到接口返回内容

本地接口测试

项目创建完成,我们想要写一些自己的接口,还是需要进行接口测试的。你可以选择任意你喜欢的工具例如postman。这里采用 apifox 进行本地接口测试

apifox配置

注册并登录之后,我们进入个人主页有一个个人空间,个人空间下又存在个人空间这个项目,我们点击进入并且配置测试环境

QQ图片20230508143157.png

QQ图片20230508143348.png

QQ图片20230508143345.png

默认情况下web端apifox是使用云端 Agent ,可以在网页右下角第一个功能按钮看到,我们要测试本地接口需要切换到 浏览器扩展 这个选项,第一次需要根据提示安装浏览器插件。

插件安装完毕并启用,回到apifox,切换到 浏览器扩展 之后就可以新建一个接口了。

QQ图片20230508143417.png

熟悉项目目录结构

入口文件在 /src/main.ts ,类似于 Vue 的项目,进入 main.ts 可以看到通过 NestFactory 创建了一个nest实例,并且这个实例监听 3000端口。

NestFactory 接口了一个参数 AppModule ,跳转到这个参数的定义,看到以下代码

// /src/app.modules.ts

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

// @Module 是一个修饰器,nest还有需要修饰器后面也有介绍
@Module({
  imports: [],
  controllers: [AppController], // 整改项目涉及到的接口都定义在 controller 中,项目中可以有各种名称的 controller
  providers: [AppService],
})
export class AppModule {}
// /src/app.controller.ts

import { Controller, Get } from '@nestjs/common'; // 两个新的装饰器
import { AppService } from './app.service';

// @Controller() 装饰器用来定义当前类的根路由,对于整个项目来说也是从根路由开始,这个修饰器可以传入一个参数,如果不传那默认就是 `/`,对应的URL就是 localhost:3000/。举一反三如果我们这样写 @Controller('coffees') 那么URL就是 localhost:3000/coffees
@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  
  @Get() // 这里的@Get()指的是你访问的URL是localhost:3000/,接口请求方式是get并且接口返回数据是 getHello 函数执行结果
  getHello(): string {
    return this.appService.getHello();
  }
}

创建自己的接口

创建自己的接口,我们需要像项目模板一样创建 controller ,你可以手动创建然后在需要用到的文件里手动导入,但这样太麻烦。nest提供了一个命令帮助我们去创建这些 controller 并且会自动导入。

nest generate controller controller-name

# 简写
nest g co controller-name

# 例如
nest g co coffees
# 生成 /src/coffees/coffees.controller.ts 和 /src/coffees/coffees.controller.spec.ts

# 指定创建后地址
nest g co modules/coffees

命令执行成功会显示创建了哪些文件、哪些文件被更新

有时我们可能需要查看一下controller创建之后的地址,但又不想真的创建这些文件,可以在命令后面加上 --dry-run

nest g co coffees --dry-run

编写接口

// /src/coffees/coffees.controller.ts

import {
  Body,
  Controller,
  Get,
  HttpCode,
  HttpStatus,
  Param,
  Post,
  Res,
} from '@nestjs/common';
import { response } from 'express';

/**
 * @Controller('coffees') controller装饰器的第一个参数表示路由
 * 这个就对应 /coffees 这个地址
 */

@Controller('coffees')
export class CoffeesController {
  // 成功的状态码是200 /coffees
  @Get()
  getCoffees() {
    return 'coffees';
  }

  // URL: /coffees/flavors
  @Get('flavors')
  findAll() {
    return 'This action returns all coffees';
  }

  // 动态路由,路由参数 /coffees/123
  @Get(':id')
  // findOne(@Param() params) {
  //   return `This action returns ${params.id} coffee`;
  // }
  findOne(@Param('id') id: string) {
    return `This action returns #${id} coffee`;
  }

  // post请求 默认成功的状态码是201 /coffees
  @Post()
  @HttpCode(HttpStatus.GONE) // 指定这个接口状态码为410
  // create(@Body('name') body) {
  //   return body; // 只会获取 name 对应的数据,谨慎使用因为不会对其他数据进行验证
  // }
  create(@Body() body) {
    return body;
  }
}