控制器

基本使用

使用控制器根据 url 匹配处理用户请求。

import { RequestContext, Controller, Get } from 'bwcx-ljsm';

@Controller('/user')
export default class UserController {
  constructor(
    // 注入请求上下文
    @Ctx() private ctx: RequestContext;
  ) {}

  @Get('/get')
  getUsers() {
    return {
      rows: [
        {
          userId: 1,
          username: 'user1',
          createdAt: new Date(),
        },
        {
          userId: 2,
          username: 'user2',
          createdAt: new Date(),
        },
      ],
    };
  }
}

如上所示,我们创建了一个 UserController 类,使用装饰器 @Controller() 将其标注为一个控制器,并指定其路由前缀为 /user。控制器类内所有被 HTTP 方法装饰器标注的方法都将自动注册为路由。

在刚才的例子中,我们声明了一个路由 /get,其会被自动注册为 GET /user/get,使用 getUsers 方法处理。

尝试访问 http://localhost:3000/user/get,其将返回一个包含所有用户的 json 数据。

还有其他的 HTTP 方法装饰器可用,如 @Post()@Put()@Patch()@Delete() 等。

TIP

@Controller() 默认作用域是 Deferred

TIP

@Ctx()@InjectCtx() 的别名。

TIP

由于依赖扫描顺序是不确定的(更准确地说,业务代码不应该依赖扫描顺序),@Controller() 的第二个参数支持传入选项 { priority: number } 来设置控制器优先级(默认为 0),以此改变路由装配顺序。

处理参数

我们提供了多个参数装饰器(包括 @Param()@Query()@Body())来直接获取用户请求的参数。

import { RequestContext, Controller, Get, Query } from 'bwcx-ljsm';

@Controller('/user')
export default class UserController {
  @Get('/get')
  getUsers(
    @Query() query: any,
    @Query('username') username: string,
  ) {
    console.log(query, username);
    return {
      rows: [
        {
          userId: 1,
          username: 'user1',
          createdAt: new Date(),
        },
        {
          userId: 2,
          username: 'user2',
          createdAt: new Date(),
        },
      ],
    };
  }
}

如上示例,被 @Query() 装饰器装饰的 query 可以直接取到用户输入的所有 url query。当然也可以通过传入一个路径参数来获取指定的值。这对其他几个参数装饰器也适用。

需要注意的是,使用内置参数装饰器取得的值是原始值,这意味在处理某些固定为 string 类型的参数(如 url query)时,即使其类型被声明为 number,实际运行时取值也是原始类型。如要校验并转换参数以确保类型安全,请参见 数据校验

TIP

框架还提供了许多使用的请求参数装饰器,如 @Header()@Cookie()@FormFile()@Referer 等。请参见 装饰器列表

自定义请求参数装饰器

框架提供了 createReqParamDecorator 方法供便捷创建定制化装饰器。

// 也可以带参数
export function Ip() {
  return createReqParamDecorator((ctx) => {
    return ctx.ip;
  });
}
@Get('/get')
getUsers(@Ip() ip: string) {
  console.log(ip);
  return {};
}