使用 Zod 和 TypeScript 在 Express.js 中验证请求数据:综合指南
介绍
Express.js 是一个用于构建 Node.js 应用程序的流行 Web 框架,而验证是安全处理传入数据的关键环节。本文将探讨如何使用 Zod(一个 TypeScript 优先的模式声明和验证库)创建通用验证中间件。该中间件可在不同的路由之间重复使用,以确保传入数据符合预定义的模式。
先决条件
在深入实施之前,请确保已安装以下先决条件:
- Node.js 和 npm
- TypeScript
- Express.js
- 佐德
通过运行以下命令安装必要的软件包:
npm install express body-parser zod
目录结构
为了保持代码的条理性,我们将按如下方式构建项目:
project-root
|-- src
| |-- routes
| | |-- userRoutes.ts
| |
| |-- middleware
| | |-- validationMiddleware.ts
| |
| |-- schemas
| | |-- userSchemas.ts
| |
| |-- index.ts
|
|-- package.json
|-- tsconfig.json
|-- ...
实现通用验证中间件
步骤 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}`);
});
第 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),
});
步骤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' });
}
}
};
}
步骤 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;
步骤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 });
};
结论
恭喜!您已成功在 Express.js 应用程序中使用 Zod 实现了通用验证中间件。这种方法允许您为应用程序的不同部分创建可重用的验证逻辑,从而提高可维护性和可扩展性。
您可以根据特定的验证需求随意自定义架构和中间件。这种结构不仅可以增强代码的可读性,还可以简化测试和代码维护。
鏂囩珷鏉ユ簮锛�https://dev.to/osalumense/validating-request-data-in-expressjs-using-zod-a-compressive-guide-3a0j