• Nestjs中控制器和路由的配置使用


    关于Nest控制器

    1 ) 控制器的作用

    • Nest中的控制器层负责处理传入的请求, 并返回对客户端的响应
    • 控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求
    • 通常,每个控制器有多个路由,不同的路由可以执行不同的操作

    2 ) 控制器的创建

    • 基于cli对控制器进行创建: $ nest g controller about
    • 一个控制器就对应一个class类, 并且通常会使用@Controller的装饰器来装饰

    示例:

    import { Controller } from '@nestjs/common';
    
    @Controller('about')
    export class AboutController {}
    
    • 1
    • 2
    • 3
    • 4
    • 当执行创建命令后,不仅生成了一个src/about目录,目录下有2个控制器文件
    • 分别是:about.controller.spec.ts 和 about.controller.ts
    • 还更新了主模块:/src/app.module.ts, 也就是自动注入了该控制器模块
    • 我们继续写业务逻辑

    示例:

    import { Controller, Get } from '@nestjs/common';
    
    @Controller('about')
    export class AboutController {
      // about
      @Get()
      index():string {
        // 注意上面的index可以随意命名,不一定要用index
        return '我是about页面';
      }
    
      // 注意在装饰器中,不要使用分号;
      // /about/more
      @Get("more")
      getMore():string {
        // 注意上面的index可以随意命名,不一定要用index
        return '我是about的更多页面';
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 当请求处理程序返回JavaScript对象或数组时,它将自动序列化为JSON
    • 但是,当它返回一个字符串时,Nest 将只发送一个字符串而不是序列化它
    • 这使响应处理变得简单:只需要返回值,Nest 负责其余部分

    3 )其他模块的创建

    • $ nest g --help 可查看哪些模块可以创建

    关于Nest路由

    1 ) 概述

    • 路由就是接口地址的另一种称谓,而且路由和控制器密不可分
    • 控制器用于响应路由请求,在写法上,我们通常会基于装饰器模式编码

    2 )装饰器的作用

    • 扩展类,方法,属性,以及参数的功能
    • 默认提供:HTTP 请求方法的装饰器 @Put() 、@Delete()、@Patch()、 @Options()、 @Head()和 @All()
    • 很好的对RESTful进行了支持,同样,对请求参数,也提供了一些内置装饰器
    @Request()                      req
    @Response()                     res
    @Next()                         next
    @Session()                      req.session
    @Param(key?: string)            req.params / req.params[key]
    @Body(key?: string)             req.body / req.body[key]
    @Query(key?: string)            req.query / req.query[key]
    @Headers(name?: string)         req.headers / req.headers[name]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3 ) 装饰器示例

    import  { Controller, Get, Post, Query, Request, Body }  from '@nest/common';
    
    @controller('cart')
    export class CartController {
      @Get()
      index() {
        return 'Shopping Cart';
      }
    
      @Get('add')
      addCart(@Query() query) {
        console.log(query);
        return 'Add To Cart';
      }
    
      @Get('edit')
      editCart(@Request() req) {
        console.log(req.query);
        return req.query;
      }
    
      @Post('create')
      create(@Body body) {
        console.log(body);
        return 'create'
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    3 ) 动态路由的配置

    import  { Controller, Get, Post, Param, Query }  from '@nest/common';
    
    @controller('order')
    export class OrderController {
      @Post('add')
      addOrder(@Query('id') id) {
        // order/add?id=123
        console.log('id: ', id)
        return id;
      }
    
      @Get(':id')
      index(@Param() param) {
        // order/123
        console.log(param);
        return '当前页面参数'
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 注意,如果路由形式大体相同,需要注意查找顺序,比如
    • order/123 和 order/add 这两种,需要将add放入上面,避免匹配不到

    4 ) 动态路由的模糊匹配

    import  { Controller, Get, Post, Param, Query }  from '@nest/common';
    
    @controller('order')
    export class OrderController {
    
      @Get('xx*yy')
      vagueMatch() {
        console.log('vague match');
        return '模糊匹配';
      }
    
      @Post('add')
      addOrder(@Query('id') id) {
        // order/add?id=123
        console.log('id: ', id)
        return id;
      }
    
      @Get(':id')
      index(@Param() param) {
        // order/123
        console.log(param);
        return '当前页面参数'
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 同样需要注意顺序问题
  • 相关阅读:
    【C/C++】2024春晚刘谦春晚魔术步骤模拟+暴力破解
    ZEMAX | 在OpticStudio中通过几何光线追迹来模拟杨氏双缝干涉实验
    双向带头循环链表之重拳出击
    [java]深度剖析自动装箱与拆箱
    如何在 Spring Boot 中提高应用程序的安全性
    详细介绍NLP文本分类
    《JavaScript前端开发与实例教程(微课视频版)》
    【菜鸡学艺–Vue2–001】模板语法&声明式渲染
    修改el-tab标签页的label默认样式(插槽)
    java基于springboot校园餐厅订餐管理系统
  • 原文地址:https://blog.csdn.net/Tyro_java/article/details/125472951