控制器
基本使用
使用控制器根据 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 {};
}