# validator中间件

validator中间件用于对query和body数据的校验和转换,在ts中,也可以对数据类型进行声明

# vquery & vbody

validator 提供了vbody和vquery两个工具方法,可以在 context 中获取到。

类型声明如下:

type IValidTemplate = {
    [prop in string]: IValidFormat | [IValidFormat, IValidRule];
}

type IValidFunc = <
    D extends IValidTemplate = IValidTemplate
>(template: D) => ({
    [prop in keyof D]: IFormatMap[(D[prop] extends string ? D[prop]: D[prop][0])];
} & {
    [prop in string]: any;
});

interface IValidatorHelper {
    vquery: IValidFunc;
    vbody: IValidFunc;
}

vquery和vbody分别用于获取校验和转换后的query和body

# 基础使用

以vquery为例举一个例子:

import { Sener, Router } from 'sener';

const router = new Router({
    '/demo': ({ vquery }) => {
        const query = vquery({
            nickname: [ 'string', 'required' ],
            age: [ 'number', 'required' ],
            weight: 'number', 
        });
        return { data: query };
    },
});

new Sener({
  middlewares: [router],
});

vquery 函数接受一个模板,键为query中需要的属性

值可以传入格式化类型(IValidFormat) 和 检验规则(IValidRule)

type IValidFormat = 'number' | 'string' | 'boolean' | 'any';
type IValidRule = 'required' | 'optional' | RegExp | ((v: any, formatValue: any) => boolean);

当值为数组是,第一位会被解析为 格式化类型,第二位会被解析为 检验规则

当值为字符串时,会被解析为 格式化类型,校验规则为默认值 optional

# 正则和函数校验

IValidRule 支持正则表达式和函数,当为函数式,参数第一个为原始值,第二个为格式化之后的值

vquery({
    nickname: [ 'string', /[a-z]{8}/i ],
    age: [ 'number', (v, fv)=>fv >= 18 ],
    weight: 'number', 
});

当校验失败时,会返回一个404响应,可以通过 Sener的onerror参数进行拦截处理

当使用ts时,返回的query和body会根据template获得友好的类型支持

文档更新时间: 5/25/2023, 9:31:58 AM