1.0.1 • Published 2 years ago

@sfajs/req-deco v1.0.1

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

@sfajs/req-deco

基于 @sfajs/inject 通过装饰器便捷使用接口参数

你需要使用装饰器并引入 @sfajs/inject 以使用此功能

Query, Header, Param, Body, Context 装饰字段,该字段在特定生命周期会被自动赋值

快速开始

import "@sfajs/inject";
import { Header, Query, Param, Body, Context } from "@sfajs/req-deco";
import { Middleware, ReadonlyDict, TestStartup, HttpContext } from "@sfajs/core";

class TestMiddleware extends Middleware {
  @Context
  private readonly ctx1!: HttpContext;
  @Header
  private readonly header!: ReadonlyDict;
  @Query
  private readonly query1!: ReadonlyDict;
  @Query
  private readonly query2!: ReadonlyDict;
  @Param
  private readonly params!: ReadonlyDict;
  @Body
  private readonly body!: ReadonlyDict;
  @Body("array")
  private readonly arrayFieldBody!: string;
  @Query("q")
  private readonly queryProperty!: string;

  async invoke(): Promise<void> {
    this.ok({
      header: this.header,
      query1: this.query1,
      query2: this.query2,
      params: this.params,
      body: this.body,
      arrayFieldBody: this.arrayFieldBody,
      queryProperty: this.queryProperty,
    });
  }
}

const res = await new TestStartup()
    .useInject()
    .add(TestMiddleware)
    .run();

上述代码中的 useInject 会启用依赖注入,@sfajs/req-deco 利用依赖注入实现功能

需要注意的是,该功能只会在 useInject 之后的中间件中生效,因此你需要把 useInject 放在靠前的位置,根据实际项目决定

在其他类中

在其他任意类中,你也可以利用控制反转实现实例化

import { parseInject } from "@sfajs/inject";
import { HttpContext } from "@sfajs/core";
import { Header, Query, Context } from "@sfajs/req-deco";

class TestClass {
  @Context
  private readonly ctx!: HttpContext;
  @Header
  private readonly header!: any;
  @Query("property")
  private readonly query!: any;
}

const obj = parseInject(TestClass); // 利用控制反转创建对象
// OR
const obj = parseInject(new TestClass());

避免在单例类中使用

由于每次接口请求,参数可能都会变

因此使用装饰器的类,其实例对象必须仅作用于单次网络访问

例如不能使用单例类或单例中间件,否则可能会在高并发下出现不可预知的问题

在这样的中间件中不能使用 @sfajs/req-deco,因为中间件是单例的:

startup.use(new YourMiddleware())
const md = new YourMiddleware();
startup.use((ctx) => md);

管道 pipe

利用管道可以实现参数校验、参数转换等

此处管道不同于管道上下文 HttpContext

用法

Header,Query 等装饰器参数可以接收管道对象或类

如果传入的是管道的类,可以利用控制反转自动实例化管道

传入类

import { Query, ParseIntPipe } from "@sfajs/req-deco"

@Query("field", ParseIntPipe)
queryField: number;

或传入对象

@Query("field", new ParseIntPipe())
queryField: number;

或转换整个 query

@Query(ParseIntPipe)
query: any;

内置管道

目前内置的管道有

  • DefaultValuePipe: 参数为 null,undefined,NaN 等,赋值默认值
  • TrimPipe: 去除字符串前后空白符,可单独限定 startend
  • ParseIntPipe: 字符串转整型
  • ParseFloatPipe: 字符串转浮点数
  • ParseBoolPipe: 字符串转布尔,可自定义对应值

自定义管道

更多需求可以自定义管道

创建一个类,实现 PipeTransform 接口,如

import { Context, PipeTransform } from "@sfajs/req-deco"

class ToStringPipe implements PipeTransform<any, string> {
  @Context
  readonly ctx: HttpContext;

  transform(value: any) {
    return "" + value;
  }
}
1.0.1

2 years ago

1.0.0

2 years ago

0.1.3

2 years ago

0.1.2

2 years ago

0.1.1

2 years ago

0.1.0

2 years ago

0.0.1

2 years ago

0.0.1-beta.1

2 years ago