NestJs 实战应用

NestJs 实战应用

项目创建

在这里插入图片描述

准备工作
确保已安装 Node.js(自带 npx 和 npm)。创建新项目的步骤如下:

npm i -g @nestjs/cli  # 全局安装 Nest CLI
nest new project-name  # 创建新项目

项目创建完成后会初始化基础文件,并提示选择依赖管理工具(推荐使用 yarn 以提升速度)。

版本要求
Nest.js 需要 Node.js ≥10.13.0(v13 除外)。若版本不符,可通过 nvm 安装合适版本。

项目结构

src
├── app.controller.spec.ts  # 控制器单元测试
├── app.controller.ts       # 基础控制器
├── app.module.ts           # 根模块
├── app.service.ts          # 基础服务
└── main.ts                 # 应用入口文件
  • main.ts:使用 NestFactory 创建应用实例,可自定义监听端口(默认 3000)。
  • app.module.ts:根模块,通过 @Module 装饰器配置:
    • providers:服务提供者(业务逻辑)
    • controllers:路由控制器
    • imports/exports:模块导入/导出

实现首个接口

  1. 启动服务
    通过 main.ts 启动服务,默认监听 3000 端口:

    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
      await app.listen(3000);
    }
    
  2. 模块与控制器

    • AppModule 引入 AppControllerAppService
    • 控制器使用 @Controller 装饰,服务通过依赖注入(@Injectable)调用

    示例代码

    // app.controller.ts
    @Controller()
    export class AppController {
      constructor(private readonly appService: AppService) {}
    
      @Get()
      getHello() { return this.appService.getHello(); }
    }
    
    // app.service.ts
    @Injectable()
    export class AppService {
      getHello() { return 'Hello World!'; }
    }
    

路由装饰器

Nest.js 通过装饰器定义路由,无需单独配置文件。

路由配置示例

@Controller("app")
export class AppController {
  // 固定路径
  @Get("list") getList() { ... }

  // 通配符路径
  @Get("user_*") getUser() { ... }

  // 参数路径
  @Put("list/:id") update() { ... }
}

开发热更新
运行 npm run start:dev 启用实时监听文件变化。

全局路由前缀

main.ts 中设置:

app.setGlobalPrefix('api');  # 所有路由添加 /api 前缀

编写代码

首先介绍几个 Nest CLI 提供的实用命令:

nest g [文件类型] [文件名] [文件目录]

如需禁用测试文件生成,可在nest-cli.json中配置:

"generateOptions": {
  "spec": false
}

创建模块

执行以下命令创建 posts 模块:

nest g mo posts

默认会在 posts 目录下生成posts.module.ts

import { Module } from '@nestjs/common';

@Module({})
export class PostsModule {}

命令执行后,根模块app.module.ts会自动引入 PostsModule:

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

@Module({
  controllers: [AppController],
  providers: [AppService],
  imports: [PostsModule],
})
export class AppModule {}

创建控制器

执行命令创建控制器:

nest g co posts

生成posts.controller.ts及其测试文件:

import { Controller } from '@nestjs/common';

@Controller('posts')
export class PostsController {}

模块文件会自动更新,将控制器注入到@Module装饰器中。

创建服务类

执行命令创建服务:

nest g service posts

生成posts.service.ts

import { Injectable } from '@nestjs/common';

@Injectable()
export class PostsService {}

服务会自动注册到模块的 providers 中。

提示:Nest CLI 还支持创建过滤器、拦截器等,后续章节会介绍。创建顺序建议:先创建 Module,再创建 Controller 和 Service,这样能自动完成注册。

快速创建 CRUD

使用资源生成命令一键创建完整模块:

nest g resource user

该命令会自动:

  1. 创建 user 文件夹
  2. app.module.ts中自动导入
  3. 生成包含基础 CRUD 操作的控制器模板:
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return this.userService.create(createUserDto);
  }

  // 其他CRUD方法...
}

请求处理示例

修改服务类返回自定义响应:

create(createUserDto: CreateUserDto) {
  return {
    code: 200,
    result: '请求成功'
  };
}

参数获取

获取POST请求体:

@Post()
create(@Body() createUserDto: CreateUserDto) {
  console.log(createUserDto);
  return this.userService.create(createUserDto);
}

获取特定字段:

create(@Body('name') name: string) {
  console.log(name); // 输出"小月"
}

DTO 定义

create-user.dto.ts中定义数据结构:

export class CreateUserDto {
  name: string;
}

获取请求头

使用@Headers装饰器:

@Post()
create(@Body() createUserDto: CreateUserDto, @Headers() headers) {
  console.log(headers);
  return this.userService.create(createUserDto);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值