使用 Zod 和 TypeScript 在 Express.js 中验证请求数据:综合指南

2025-06-10

使用 Zod 和 TypeScript 在 Express.js 中验证请求数据:综合指南

介绍

Express.js 是一个用于构建 Node.js 应用程序的流行 Web 框架,而验证是安全处理传入数据的关键环节。本文将探讨如何使用 Zod(一个 TypeScript 优先的模式声明和验证库)创建通用验证中间件。该中间件可在不同的路由之间重复使用,以确保传入数据符合预定义的模式。

先决条件

在深入实施之前,请确保已安装以下先决条件:

  • Node.js 和 npm
  • TypeScript
  • Express.js
  • 佐德

通过运行以下命令安装必要的软件包:

npm install express body-parser zod
Enter fullscreen mode Exit fullscreen mode

目录结构

为了保持代码的条理性,我们将按如下方式构建项目:

project-root
|-- src
|   |-- routes
|   |   |-- userRoutes.ts
|   |
|   |-- middleware
|   |   |-- validationMiddleware.ts
|   |
|   |-- schemas
|   |   |-- userSchemas.ts
|   |
|   |-- index.ts
|
|-- package.json
|-- tsconfig.json
|-- ...
Enter fullscreen mode Exit fullscreen mode

实现通用验证中间件

步骤 1:设置 Express App

在您的index.ts文件中,设置一个 Express 应用程序并配置中间件:

// src/index.ts
import express from 'express';
import bodyParser from 'body-parser';
import userRouter from './routes/userRoutes';

const app = express();
const PORT = 3000;

app.use(bodyParser.json());
app.use('/api/user', userRouter);

app.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});
Enter fullscreen mode Exit fullscreen mode

第 2 步:创建 Zod 模式

userSchemas.ts文件中的不同部分定义 Zod 模式:

// src/schemas/userSchemas.ts
import { z } from 'zod';

export const userRegistrationSchema = z.object({
  username: z.string(),
  email: z.string().email(),
  password: z.string().min(8),
});

export const userLoginSchema = z.object({
  username: z.string(),
  password: z.string().min(8),
});
Enter fullscreen mode Exit fullscreen mode

步骤3:构建通用验证中间件

在以下位置创建通用验证中间件validationMiddleware.ts

// src/middleware/validationMiddleware.ts
import { Request, Response, NextFunction } from 'express';
import { z, ZodError } from 'zod';

import { StatusCodes } from 'http-status-codes';

export function validateData(schema: z.ZodObject<any, any>) {
  return (req: Request, res: Response, next: NextFunction) => {
    try {
      schema.parse(req.body);
      next();
    } catch (error) {
      if (error instanceof ZodError) {
      const errorMessages = error.errors.map((issue: any) => ({
            message: `${issue.path.join('.')} is ${issue.message}`,
        }))
        res.status(StatusCodes.BAD_REQUEST).json({ error: 'Invalid data', details: errorMessages });
      } else {
        res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: 'Internal Server Error' });
      }
    }
  };
}
Enter fullscreen mode Exit fullscreen mode

步骤 4:在路由中使用通用验证中间件

在您的 中userRoutes.ts,针对不同的路由使用通用中间件:

// src/routes/userRoutes.ts
import express from 'express';
import { validateData } from '../middleware/validationMiddleware';
import { userRegistrationSchema, userLoginSchema } from '../schemas/userSchemas';

const userRouter = express.Router();

import { registerUser, loginUser } from './userController';

userRouter.post('/register', validateData(userRegistrationSchema), registerUser);
userRouter.post('/login', validateData(userLoginSchema), loginUser);

export default userRouter;
Enter fullscreen mode Exit fullscreen mode

步骤5:实现用户控制器逻辑

创建一个用户控制器来userController.ts处理用户注册和登录:

// src/routes/userController.ts
import { Request, Response } from 'express';

export const registerUser = (req: Request, res: Response) => {
  // Handle user registration logic using validated data from req.body
  res.json({ message: 'User registered successfully', data: req.body });
};

export const loginUser = (req: Request, res: Response) => {
  // Handle user login logic using validated data from req.body
  res.json({ message: 'User logged in successfully', data: req.body });
};
Enter fullscreen mode Exit fullscreen mode

结论

恭喜!您已成功在 Express.js 应用程序中使用 Zod 实现了通用验证中间件。这种方法允许您为应用程序的不同部分创建可重用的验证逻辑,从而提高可维护性和可扩展性。

您可以根据特定的验证需求随意自定义架构和中间件。这种结构不仅可以增强代码的可读性,还可以简化测试和代码维护。

鏂囩珷鏉ユ簮锛�https://dev.to/osalumense/validating-request-data-in-expressjs-using-zod-a-compressive-guide-3a0j
PREV
我何时何地使用 px、rem、vw 和 vh
NEXT
制作更好的 HTTP API