decorator-validator
Version:
decorator-validator 是基于 [zod](https://github.com/colinhacks/zod) 开发的http params 验证装饰器
58 lines (48 loc) • 1.89 kB
text/typescript
import { DarukContext } from 'daruk';
export * as z from 'zod';
type ErrDetail = {
code: string,
expected: string,
received: string,
path: [],
message: string,
}
type RefineParams = {
success: boolean,
data?: object,
error?: {
errors: ErrDetail[],
},
};
type ValidatorConfig = {
query?: any, body?: any, params?: any
}
export function validator(validatorConfig: ValidatorConfig): any {
return (_target: Object, _propertyKey: string, descriptor: PropertyDescriptor) => {
const { query, body, params } = validatorConfig;
const validate = async (ctx: DarukContext) => {
const ERR_INFO: string[] = [];
if (params) {
const validateParams: RefineParams = await params.safeParse(ctx.params);
if (!validateParams.success) ERR_INFO.push(`params data validator error: ${validateParams.error?.errors.reduce((accumulator, item) => accumulator + `, ${item.path.join('-')} (${item.message})`, '')}`);
}
if (query) {
const validateQuery: RefineParams = await query.safeParse(ctx.query);
if (!validateQuery.success) ERR_INFO.push(`query data validator error: ${validateQuery.error?.errors.reduce((accumulator, item) => accumulator + `, ${item.path.join('-')} (${item.message})`, '')}`);
}
if (body) {
const validateBody: RefineParams = await body.safeParse(ctx.request.body);
if (!validateBody.success) ERR_INFO.push(`body data validator error: ${validateBody.error?.errors.reduce((accumulator, item) => accumulator + `, ${item.path.join('-')} (${item.message})`, '')}`);
}
if (ERR_INFO.length > 0) {
throw new Error(ERR_INFO.join('; '));
}
};
const targetFunc = descriptor.value;
descriptor.value = async function (...args: DarukContext[]) {
await validate(args[0]);
await targetFunc(...args);
};
return descriptor;
};
}