用于标记一个 Class 或者 Class 中的一个方法为无效的。
目前支持这个装饰器的位置只有 ToraRouter 中标记了 @Get,@Post 等装饰器的方法。
无效化的是将该函数添加进处理函数列表的操作。
import { Disabled, Post, ToraRouter } from 'tora'
@ToraRouter('/')
class TestRouter {
constructor() {
}
// 这里标记为 `@Disabled()` 之后,加载 `TestRouter` 时,test 方法,将不会添加为监听函数。
@Disabled()
@Post()
async test() {
return 'OK'
}
}
目前没有可用的选项内容,后续可能会添加一些。
这是一个调试用的装饰器。
在一个 Tora 组件上使用 @EchoDependencies
会在加载组件时将入参类型打印到控制台。
这里的类型是指在被 Inject 装饰器替换之前的。
注意:由于在执行方法装饰器时无法拿到类名,所以使用 EchoDependencies
输出方法参数时,必须在 class 上同时使用。单独使用在方法上的 EchoDependencies
不会输出任何内容。
import { Disabled, Post, ToraRouter, EchoDependencies, SessionContext, ApiParams } from 'tora'
/**
* 加载时会输出:
* TestRouter dependencies [
* [class SomeDependency1],
* [class SomeDependency2],
* [class SomeDependency3],
* ]
*/
@EchoDependencies()
@ToraRouter('/')
class TestRouter {
constructor(
private dependency1: SomeDependency1,
private dependency2: SomeDependency2,
private dependency3: SomeDependency3,
) {
}
/**
* 加载时会输出:
* TestRouter.test dependencies [
* [class SessionContext],
* [class ApiParams extends Judgement]
* ]
*/
@EchoDependencies()
@Post()
async test(
cs: SessionContext,
params: ApiParams<{
a: string
b: number
}>
) {
return 'OK'
}
}
当你需要使用 Class 和 Enum 以外的值进行依赖查找时,可以使用此装饰器。
比如使用一些特殊的字符串。
在 typescript 中实现依赖注入时,用来查找依赖项的 token 需要满足条件:即是值,又是类型。
在当前的 typescript 版本中(< 4.2.3),满足这个条件的概念只有 Class 和 Enum。
要使用其他的值表示类型单纯通过 reflect-metadata 就做不到了。
@Inject
就是一种辅助实现方式。
在使用 @Inject 进行注入查找前需要先注册一个 Provider。
import { Post, ToraRouter } from 'tora'
@ToraRouter('/', {
providers: [
// 这里进行注册。
{ provide: 'some_token', useValue: 'value_of_some_token' }
]
})
class TestRouter {
constructor() {
}
@Post()
async test(
@Inject('some_token') params: string,
) {
console.log(params) // 这里会打印 'value_of_some_token'。
return 'OK'
}
}
任何可以通过 === 进行相等判断的值。一般会选择具有某些含义的字符串。
向 Class 标记一些自定义元信息,在自定义装饰器工具 AnnotationTools
中会很有用。
将 Tora.ToraRouter 中的一个方法标记为 DELETE 请求处理函数。
将 Tora.ToraRouter 中的一个方法标记为 GET 请求处理函数。
将 Tora.ToraRouter 中的一个方法标记为 POST 请求处理函数。
将 Tora.ToraRouter 中的一个方法标记为 PUT 请求处理函数。
将 Tora.ToraRouter 中的一个请求处理函数标记为需要进行授权。
将 Tora.ToraRouter 中的一个请求处理函数标记为结果需要进行缓存。
将 Tora.ToraRouter 中的一个请求处理函数标记为结果不需要进行 wrap 操作。
Tora.ToraRouter 的扩展函数。
将 Tora.ToraTrigger 中的一个任务标记为需要上锁。
通过实现 TaskLock 并注入服务来实现任务的锁机制。
import { ToraTrigger, Task } from 'tora'
@ToraTrigger({
providers: [
// 这里的 SomeTaskLockImpl 需要自己实现。
{ provide: TaskLock, useClass: SomeTaskLockImpl },
]
})
class TestTrigger {
constructor() {
}
/**
* @Lock: 这里标记了锁的元信息,使用 key 唯一确定一把锁,并期望 300 秒后锁自动解开。
* 具体的锁行为通过实现 TaskLock 类,并注入服务实现。
* @Taks: 这里的 @Task 将 `TestTrigger.test` 标记为一个定时任务。
* '*\/5 * * * *' 表示每 5 分钟执行一次。
*/
@Lock({ key: 'some_unique_key', expires: 300 })
@Task('*/5 * * * *')
async test() {
console.log('do something.')
}
}
将 Tora.ToraTrigger 中的一个方法标记为一个任务。
任务计划
把一个类标记为 Tora.ToraModule,并提供配置元数据。
import { Tora } from 'tora'
@Tora.Module({
imports: [
SampleDependency1,
SampleDependency2,
],
providers: [
SampleComponent1,
SampleComponent2,
],
})
class SampleModule {
}
把一个类标记为 Tora.ToraRoot,并提供配置元数据。
import { Tora } from 'tora'
@Tora.ToraRoot({
imports: [
SampleDependency1,
SampleDependency2,
],
providers: [
SampleComponent1,
SampleComponent2,
],
routers: [
SampleToraRouter1,
SampleToraRouter2,
],
tasks: [
SampleToraTrigger1,
SampleToraTrigger2,
]
})
class SampleRoot {
}
把一个类标记为 Tora.ToraRouter,并配置元数据。
import { Tora } from 'tora'
@Tora.Router('/test', {
imports: [
SampleDependency1,
SampleDependency2,
],
providers: [
SampleComponent1,
SampleComponent2,
],
})
export class SampleRouter {
constructor(
public sc1: SampleComponent1,
private sc2: SampleComponent2,
) {
}
@Get('test-get')
async test_get_method() {
return 'OK'
}
}
把一个类标记为 Tora.ToraService。
import { Tora } from 'tora'
@Tora.Component()
export class SampleUserService {
constructor(
private uuid: UUID,
private user: SampleUserDao,
) {
}
async create(phone: string, name: string) {
return this.user.insert({
id: this.uuid.create(),
phone: phone,
name: name,
created_at: new Date().getTime()
})
}
}
把一个类标记为 Tora.ToraTrigger,并配置元数据。
import { Tora } from 'tora'
@Tora.Trigger({
imports: [
SampleDependency1,
SampleDependency2,
],
providers: [
SampleComponent1,
SampleComponent2,
],
})
export class SampleTrigger {
constructor(
public sc1: SampleComponent1,
private sc2: SampleComponent2,
) {
}
@Task('*/5 * * * *')
async sample_task() {
this.sc1.do_something()
this.sc2.do_something()
return 'OK'
}
}
Generated using TypeDoc
Copyright (c) Plank Root.
This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree.