Skip to content
页面信息
📝 描述用于路由处理方法的参数绑定装饰器和类型验证器

@hydrooj/framework 装饰器与验证器

用于路由处理方法的参数绑定装饰器和类型验证器。

ts
import { param, query, post, route, Types } from 'hydrooj';

参数装饰器

将处理方法的参数绑定到特定请求源的装饰器。它们在将值传递给方法之前进行提取、验证和转换。

装饰器来源说明
param全部(query + body)从合并后的请求参数中绑定参数。
query查询字符串request.query 绑定参数(GET 参数)。
get查询字符串query 的别名。
post请求体request.body 绑定参数(POST body)。
route路由参数从路由路径参数及 domainId 绑定参数。
subscribe将方法(或类)注册为指定频道名的 WebSocket 订阅处理器。

用法

每个参数装饰器接受 (name: string, type?: Type, ...options)

ts
class MyHandler extends Handler {
    @param('name', Types.ShortString)
    @param('page', Types.PositiveInt, true)       // 可选
    @param('tags', Types.CommaSeperatedArray)
    async run(name: string, page: number | undefined, tags: string[]) { }
}

签名

ts
(name: string, type: Type, validate?: Validator | null, convert?: Converter) => MethodDecorator
(name: string, type?: Type, isOptional?: boolean, validate?: Validator, convert?: Converter) => MethodDecorator

Type 可以是 Schemastery schema 或元组 [convert, validate?, isOptional?]

类型验证器 — Types

预置的类型定义,组合了转换器和验证器。每个都是 Type<T>,可用作任何参数装饰器的第二个参数。

字符串类型

名称输出说明
Types.Contentstring多行文本内容(去除首尾空格,最长 65535 字符)。
Types.Keystring标识符键(/^[\w-]{1,255}$/,SASLprep)。
Types.Namestring通用名称字段(1–255 字符,SASLprep)。@deprecated
Types.Usernamestring用户名(3–31 字符或 2 个 CJK 字符,SASLprep)。
Types.Passwordstring密码字符串(6–255 字符)。
Types.UidOrNamestring用户 ID(数字)或用户名(3–31 字符或 2 个 CJK 字符,SASLprep)。
Types.Emailstring邮箱地址(user@domain.tld,SASLprep)。
Types.Filenamestring文件名(1–255 字符,不含 `/?#~!
Types.DomainIdstring域标识符(字母开头,4–32 个 \w 字符,SASLprep)。
Types.ProblemIdstring | number题目 ID —— 数字字符串自动转换为 number
Types.Rolestring角色名(1–31 个 \w 或 CJK 字符,SASLprep)。
Types.Titlestring短标题(1–64 字符,去除首尾空格)。
Types.ShortStringstring短字符串(1–255 字符)。
Types.Stringstring任意非空字符串。
Types.Emojistring单个 emoji 字符。

数值类型

名称输出说明
Types.Intnumber有符号整数(从字符串转换)。
Types.UnsignedIntnumber非负整数(允许零)。
Types.PositiveIntnumber正整数(≥ 1)。
Types.Floatnumber有限浮点数(从字符串转换)。

特殊类型

名称输出说明
Types.ObjectIdObjectIdMongoDB ObjectId(通过 ObjectId.isValid 验证)。
Types.Booleanboolean布尔值 —— 除 'false'/'off'/'no'/'0' 外的值为真;始终可选。
Types.DatestringYYYY-MM-DD 格式的日期字符串(零填充)。
Types.TimestringHH:MM 格式的时间字符串(零填充)。

组合类型

名称输出说明
Types.Range(arr | obj)T接受给定数组或对象键中的任意值;数字字符串自动转换为 number
Types.NumericArraynumber[]有限数字数组(逗号分隔字符串或 JSON 数组)。
Types.CommaSeperatedArraystring[]以逗号分隔的字符串数组。
Types.SetSet<any>将数组或单个值转换为 Set
Types.Anyany透传,不做验证。
Types.ArrayOf(type, isOptional?)T[]将任意 Type<T> 包装为数组变体;可选元素变为 undefined
Types.AnyOf(...types)T联合类型 —— 接受匹配给定类型中任意一个的值。

工具类型

重新导出的 TypeScript 类型,用于构建自定义验证器:

类型说明
Converter<T>(value: any) => T —— 将原始输入转换为类型化输出。
Validator(value: any) => boolean —— 值有效时返回 true
Type<T>Schema<T> | readonly [Converter<T>, Validator?, (boolean | 'convert')?] —— Schemastery schema 或 [convert, validate?, optional?] 元组。