第 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) => {
  return (req: Request, res: Response, next: NextFunction) => {
    const { error } = schema.validate(req.body);
    const valid = error == null;

    if (valid) {
      next();
    } else {
      const { details } = error;
      const message = details.map((i) => i.message).join(',');

      const newMessage = message.replace(/"/g, '');
      res.status(422).json({
        status: 'error',
        message: newMessage,
      });
    }
  };
}; 

export { validate };

🛠️ 步骤 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 请求。中间件将自动处理错误并返回用户友好的响应。🎉

Image description

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