第 4 步即可使用 Joi 简化验证 🚀
告别冗长的 `if-else` 验证块!使用 **Joi** npm 包,只需 **4 个简单步骤** 即可实现干净高效的验证。
在深入了解这些步骤之前,让我们先看看如何使用 if-else 编写验证。
const validateCreateCareer = (req, res, next) => {
const { title, description, teamType, location, skills, salary, jobLevel, postingDate, employmentType, experienceRequired, remote } = req.body;
if (!title) {
return res.status(400).json({ status: 'error', message: 'Title is required.' });
}
if (!description) {
return res.status(400).json({ status: 'error', message: 'Description is required.' });
}
if (!teamType || !['Engineering', 'Marketing', 'Sales'].includes(teamType)) { // Example teamType values
return res.status(400).json({ status: 'error', message: 'Invalid or missing teamType.' });
}
if (!Array.isArray(location) || location.some((loc) => typeof loc !== 'string')) {
return res.status(400).json({ status: 'error', message: 'Location must be an array of strings.' });
}
if (!Array.isArray(skills) || skills.some((skill) => typeof skill !== 'string')) {
return res.status(400).json({ status: 'error', message: 'Skills must be an array of strings.' });
}
if (salary !== undefined && typeof salary !== 'number') {
return res.status(400).json({ status: 'error', message: 'Salary must be a number.' });
}
next(); // Proceed if all validations pass
};
export default validateCreateCareer;if-else 验证的缺点
💣 冗长:代码变得冗长且重复。
💣 容易出错:错过边缘情况或拼写错误的风险更高。
💣维护:随着需求的增长,维护或扩展变得更加困难。
现在让我们看看
🛠️ 步骤 1:安装 Joi 包
运行以下命令安装 Joi:
npm i joi
🛠️ 第 2 步:配置 Joi 验证中间件
创建可重复使用的验证中间件来简化您的验证过程:
import Joi from 'joi';
import { Request, Response, NextFunction } from 'express';
const validate = (schema: Joi.ObjectSchema🛠️ 步骤 3:创建 Joi 验证器文件
在专用文件中定义验证模式:
createCareerSchema: Joi.object().keys({
title: Joi.string().required(),
description: Joi.string().required(),
teamType: Joi.string().valid(...Object.values(TeamType)).required(),
location: Joi.array().items(Joi.string()).required(),
skills: Joi.array().items(Joi.string()).required(),
salary: Joi.number(),
jobLevel: Joi.string().valid("Junior", "Mid-Level", "Senior").required(),
postingDate: Joi.date().iso().required(),
employmentType: Joi.string().valid("Full-Time", "Part-Time", "Contract").required(),
experienceRequired: Joi.number().integer().min(0).required(),
remote: Joi.boolean().default(false),
}),
};
export default careersSchema;🛠️ 步骤 4:在你的路线中使用它
在您的 Express 路由中集成验证中间件:
import { validate } from './middleware/validate';
import careersSchema from './validators/careersSchema';
import CareersController from './controllers/CareersController';
router.patch(
"/careers/:id/update",
validate(careersSchema.updateCareerSchema),
CareersController.updateCareer
);
router.post(
"/careers",
validate(careersSchema.createCareerSchema),
CareersController.createCareer
);
export default router;✅ 测试一下!
尝试发出缺少或无效字段的 API 请求。中间件将自动处理错误并返回用户友好的响应。🎉

通过这 4 个步骤,您的验证过程将变得简洁、高效且易于维护。祝您编码愉快!🚀