在koa2中如何使用zod进行优雅的数据校验,作为中间件集成到路由中
2026-04-24 06:57:546 浏览132 字作者:dk技术
标签koa2zod
1. 编写通用校验中间件
这个中间件的作用是:校验通过就往后走,不通过直接拦截并返回错误。
TypeScript
import { Context, Next } from 'koa';
import { ZodSchema, ZodError } from 'zod';
export const validate = (schema: ZodSchema) => {
return async (ctx: Context, next: Next) => {
try {
// 校验请求体,校验通过后返回的是经过处理(如去空格、转类型)的数据
ctx.request.body = await schema.parseAsync(ctx.request.body);
await next();
} catch (err) {
if (err instanceof ZodError) {
ctx.status = 400;
ctx.body = {
msg: '参数校验失败',
errors: err.errors // 包含具体的字段错误信息
};
} else {
throw err;
}
}
};
};
2. 定义 Schema (你的博客数据模型)
在 schemas 文件夹下定义你的数据规则。
TypeScript
import { z } from 'zod';
// 定义发布文章的规则
export const PostSchema = z.object({
title: z.string().min(2, "标题太短了").max(100),
content: z.string().min(10, "内容多写点吧"),
tags: z.array(z.string()).optional(),
});
3. 在路由中直接使用
直接把 validate(Schema) 塞进路由参数里,像这样:
TypeScript
import Router from 'koa-router';
const router = new Router();
// 只有校验通过,才会进入后面的 async 回调
router.post('/api/posts', validate(PostSchema), async (ctx) => {
const postData = ctx.request.body;
// 这里的 postData 已经是干净且安全的了,直接存数据库
ctx.body = { msg: '发布成功', data: postData };
});