在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 };
});

评论区

0 条评论

还没有评论,欢迎成为第一个留言的人。