美文网首页Nest.js
2、Nest.js 创建基本的REST控制器

2、Nest.js 创建基本的REST控制器

作者: RoyLin1996 | 来源:发表于2018-07-30 18:51 被阅读852次

    使用 Nest CLI 生成一个基本的控制器

    使用 CLI 提供的 generate (别名:g) 命令生成一个基本的 users Controller (别名: co):

    $ nest g co users
    CREATE /src/users/users.controller.spec.ts (478 bytes)
    CREATE /src/users/users.controller.ts (99 bytes)
    UPDATE /src/app.module.ts (658 bytes)
    
    

    Nest CLI 会自动在 src 目录下创建一个 users 目录作为 users 模块,并且在 app.module.ts 中注入该控制器:

    src/app.module.ts
    
    import { Module } from '@nestjs/common';
    import { UsersController } from './users/users.controller';
    
    @Module({
      controllers: [UsersController],
    })
    export class ApplicationModule {}
    
    
    src/users/user.controller.ts
    
    import { Controller } from '@nestjs/common';
    
    @Controller('users')
    export class UsersController {}
    
    

    控制器必须使用 @Controller() 装饰器修饰,传入的 'users' 就是该控制器中所有 action 的路由前缀。

    去中心化的路由

    首先在 user 控制器同级创建一个 interfaces 目录,并定义一个 User 接口:

    src/users/interfaces/user.interface.ts
    
    export interface User {
        readonly id: number;
        readonly name: string;
        readonly age: number;
    }
    

    现在给这个控制器添加一个获取所有用户的 action:

    import { Controller, Get } from '@nestjs/common';
    import { User } from './interfaces/user.interface';
    
    @Controller('users')
    export class UsersController {
        @Get()
        async findAll(): Promise<User[]> {
    
            return [{
                id: 1,
                name: '小明',
                age: 18
            }];
        }
    }
    

    这里使用 Async / Await 语法,并返回一个泛型 Promise<User[]>。
    此时使用 npm run start:dev 启动项目,并访问 http://127.0.0.1:3000/users,在 chrome 开发者工具中可以看到请求的响应信息。

    image.png

    有三个比较重要的地方:

    Status Code: 200 OK    // 响应状态代码在默认情况下总是 200
    
    Content-Type: application/json; charset=utf-8  // 当返回 JavaScript 对象或数组时, 它会自动转换为 JSON。当返回字符串, Nest 将只发送一个字符串而不尝试解析它。
    
    X-Powered-By: Express  // 底层服务使用 Express
    

    Nest 以同样的方式提供了其他的装饰器来处理不同类型的 HTTP请求 - @Put(),@Delete(),@Patch(),@Options(),@Head() 和 @All()。

        @Post()
        async create() {
            // TODO:创建新用户
        }
    
        @Put()
        async edit() {
            // TODO: 修改用户信息
        }
    
        @Delete()
        async remove() {
            // TODO:删除已有用户
        }
    
    

    所有这些装饰器都从 @nestjs/common 包中导出:

    import { Controller, Param, Get, Post, Put, Delete } from '@nestjs/common';
    
    

    带参数的路由

    和 Express 带参数的路由一样,只需要在 @Get() 装饰器中传入 " : + [ 参数名 ] ",新增一个 findOne Action:

    
        @Get(':id')
        async findOne(@Param() params): Promise<User> {
            
            return {
                id: params.id,
                name: '小明',
                age: 18
            };
        }
    
    

    现在访问 http://127.0.0.1:3000/users/44 将得到以下输出:

    {"id":"44","name":"小明","age":18}
    

    下面这个表就是 Nest 装饰器和 HTTP 请求上下文对象的映射关系:

    image.png

    上一篇:1、Nest.js 项目搭建
    下一篇:3、Nest.js 中的依赖注入与提供者

    相关文章

      网友评论

        本文标题:2、Nest.js 创建基本的REST控制器

        本文链接:https://www.haomeiwen.com/subject/aiofvftx.html