安装
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配置
注册并登录之后,我们进入个人主页有一个个人空间,个人空间下又存在个人空间这个项目,我们点击进入并且配置测试环境
默认情况下web端apifox是使用云端 Agent
,可以在网页右下角第一个功能按钮看到,我们要测试本地接口需要切换到 浏览器扩展 这个选项,第一次需要根据提示安装浏览器插件。
插件安装完毕并启用,回到apifox,切换到 浏览器扩展 之后就可以新建一个接口了。
熟悉项目目录结构
入口文件在 /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;
}
}