当前位置: 首页 > news >正文

nestjs @Get 从入门到精通

一、基础入门:静态路由与简单响应

  1. 定义基础 GET 路由
    使用 @Controller() 指定路由前缀,@Get() 定义方法路径:

    import { Controller, Get } from '@nestjs/common';@Controller('cats')
    export class CatsController {@Get()findAll(): string {return 'This action returns all cats'; // 访问 /cats 返回字符串}
    }
    
  2. 返回 JSON 数据
    NestJS 自动将对象序列化为 JSON:

    @Get()
    findAll(): { name: string; age: number }[] {return [{ name: 'Whiskers', age: 3 }, { name: 'Fluffy', age: 5 }];
    }
    

二、进阶技巧:动态路由与查询参数

  1. 动态路由参数
    通过 :param 语法提取路径中的动态参数,结合 @Param() 获取值:

    import { Param } from '@nestjs/common';@Get(':id')
    findOne(@Param('id') id: string): string {return `Cat ID: ${id}`; // 访问 /cats/123 返回 "Cat ID: 123"
    }
    
  2. 查询字符串参数
    使用 @Query() 获取 URL 查询参数(如 ?name=Whiskers):

    import { Query } from '@nestjs/common';@Get('search')
    search(@Query('name') name: string): string {return `Searching for cat named ${name}`; // 访问 /cats/search?name=Whiskers
    }
    
  3. 批量提取查询参数
    直接使用 @Query() 不传参数,获取所有查询参数的键值对:

    @Get('filter')
    filter(@Query() filters: { age?: number; color?: string }): string {return `Filtered by: ${JSON.stringify(filters)}`;
    }
    

三、高级应用:路由重定向与元数据

  1. 路由重定向
    使用 @Redirect() 将请求重定向到其他 URL:

    import { Redirect } from '@nestjs/common';@Get('old')
    @Redirect('/cats/new', 301) // 301 永久重定向
    redirectToNew() {return { url: '/cats/new' };
    }
    
  2. 设置元数据
    通过 @SetMetadata() 添加路由元数据,用于后续拦截器或守卫处理:

    import { SetMetadata } from '@nestjs/common';@Get('admin')
    @SetMetadata('roles', ['admin']) // 标记需要管理员权限
    adminDashboard() {return 'Admin Dashboard';
    }
    

四、最佳实践:代码组织与性能优化

  1. 模块化路由
    将相关路由拆分到不同控制器,并通过 @Module() 导入:

    // cats.controller.ts
    @Controller('cats')
    export class CatsController { /* ... */ }// app.module.ts
    @Module({imports: [],controllers: [CatsController], // 注册控制器providers: [],
    })
    export class AppModule {}
    
  2. 统一前缀管理
    通过 app.setGlobalPrefix() 为所有路由添加公共前缀(如 /api):

    // main.ts
    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './app.module';async function bootstrap() {const app = await NestFactory.create(AppModule);app.setGlobalPrefix('api'); // 所有路由前缀变为 /api/catsawait app.listen(3000);
    }
    bootstrap();
    
  3. 性能优化:缓存响应
    使用 @CacheInterceptor() 缓存频繁访问的 GET 请求结果:

    import { CacheInterceptor, Controller, Get, UseInterceptors } from '@nestjs/common';@Controller('cats')
    @UseInterceptors(CacheInterceptor) // 启用缓存
    export class CatsController {@Get('popular')findPopularCats() {return ['Whiskers', 'Fluffy']; // 结果会被缓存}
    }
    

五、常见问题与解决方案

  1. 问题:路由冲突

    • 原因:多个路由匹配同一路径(如 /cats/:id/cats/new)。
    • 解决:调整路由顺序,将静态路径(如 /new)放在动态路径(如 /:id)之前。
  2. 问题:参数类型错误

    • 原因@Param('id') 默认返回字符串,需手动转换类型。
    • 解决:在服务层转换类型或使用 class-validator 验证:
      import { IsNumberString } from 'class-validator';class GetCatDto {@IsNumberString()id: string;
      }@Get(':id')
      findOne(@Param() params: GetCatDto) {const numericId = parseInt(params.id, 10);return `Numeric ID: ${numericId}`;
      }
      
  3. 问题:跨域请求(CORS)

    • 解决:在 main.ts 中启用 CORS:
      async function bootstrap() {const app = await NestFactory.create(AppModule);app.enableCors(); // 允许所有跨域请求await app.listen(3000);
      }
      

六、完整示例:RESTful API 实现

import { Controller, Get, Param, Query, CacheInterceptor, UseInterceptors } from '@nestjs/common';@Controller('cats')
@UseInterceptors(CacheInterceptor) // 启用缓存
export class CatsController {// 静态路由@Get()findAll(): string[] {return ['Whiskers', 'Fluffy', 'Mittens'];}// 动态路由@Get(':id')findOne(@Param('id') id: string): string {return `Cat ID: ${id}`;}// 查询参数@Get('search')search(@Query('name') name: string): string {return `Searching for: ${name}`;}// 批量查询参数@Get('filter')filter(@Query() filters: { age?: number; color?: string }): string {return `Filtered by: ${JSON.stringify(filters)}`;}
}
http://www.dtcms.com/a/312303.html

相关文章:

  • 选择排序原理与C语言实现详解
  • Python 小数据池(Small Object Pool)详解
  • golang的包和闭包
  • 【Linux】linux基础开发工具(三) 版本控制器Git、调试器 - gdb/cgdb使用、一些实用的调试技巧
  • Libevent(5)之使用教程(4)工具
  • 二叉树的锯齿形层次遍历
  • 日语学习-日语知识点小记-进阶-JLPT-真题训练-N1阶段(2):018年7月-JLPT-N1
  • TI 毫米波雷达开发:(四)毫米波雷达板开发所需软件
  • 记一次v-if和key错误使用,导致vue2的内存爆炸修复!
  • 著作权登记遇难题:创作者如何突破确权困境?
  • 【论文阅读|V2M: VISUAL 2-DIMENSIONAL MAMBA FOR IMAGE REPRESENTATION LEARNING】
  • 字节-面试
  • 性能测试工具ApacheBench、Jmeter
  • gitee使用教程
  • 昇思学习营-开发版-模型推理和性能优化
  • 在 Elasticsearch 中使用 LTR 参与检索
  • k8s+isulad 国产化技术栈云原生技术栈搭建3-master节点安装
  • 查找位置函数
  • 垃圾收集器G1ZGC详解
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 77-1(题目+回答)
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 76-1(题目+回答)
  • set和map使用
  • 技巧|SwanLab记录混淆矩阵攻略
  • express-jwt报错:Error: algorithms should be set
  • 【智能体cooragent】不同的单智能体调用的大模型的推理的输入与输出
  • 笔试——Day26
  • 【LLM】如何在Cursor中调用Dify工作流
  • Makefile 从入门到精通:自动化构建的艺术
  • 【Java基础知识 16】 数组详解
  • 微积分思想的严密性转变 | 极限、逼近与程序化