Egg.js + Joi 进行接口参数验证

news2024/10/6 10:30:06

Joi 是一款强大的 JavaScript 数据验证库,用于验证和转换数据的格式。无论是在后端还是前端开发中,数据验证都是确保数据完整性和一致性的关键步骤。Joi 提供了一种简洁而灵活的方式来定义验证规则,以确保输入数据满足预期要求。
本文将介绍如何使用 Joi 进行数据验证,以及在 Egg.js 如何集成 Joi 进行接口参数验证。

Egg.js + Joi

一、Joi 简介

Joi 是一个 Node.js 模块,用于验证 JavaScript 对象的结构和值。它提供了一个流畅的 API,可以轻松定义数据验证规则。无论是验证用户输入、API 请求还是配置文件,Joi 都可以帮助开发者确保数据的合法性。

二、安装 Joi

在开始之前,确保你的项目已经安装了 Node.js。要在项目中使用 Joi,可以通过 npm 或 pnpm 进行安装:

npm install joi
# 或者
pnpm add joi

三、Joi 基本用法

以下是使用 Joi 进行基本数据验证的示例:

const Joi = require('joi');

// 定义验证规则
const schema = Joi.object({
  username: Joi.string().alphanum().min(3).max(30).required(),
  email: Joi.string().email().required(),
  age: Joi.number().integer().min(18).max(99),
});

// 要验证的数据
const data = {
  username: 'john_doe',
  email: 'john@example.com',
  age: 25,
};

// 进行验证
const result = schema.validate(data);

if (result.error) {
  console.error(result.error.details);
} else {
  console.log('数据验证通过');
}

在上面的示例中,我们首先定义了一个验证规则 schema,然后创建了一个要验证的数据对象 data。通过调用 schema.validate(data) 方法,我们可以获得验证结果。如果数据符合规则,result.error 将为 null,否则会包含错误信息的详细列表。

四、Joi 高级用法

Joi 不仅可以验证基本的数据类型,还可以处理复杂的数据结构,例如嵌套对象、数组和异步验证。以下是一些高级用法示例:

  1. 嵌套对象验证:
const addressSchema = Joi.object({
  street: Joi.string().required(),
  city: Joi.string().required(),
  zipCode: Joi.string().pattern(/^\d{5}$/).required(),
});

const personSchema = Joi.object({
  name: Joi.string().required(),
  age: Joi.number().integer().min(0).required(),
  address: addressSchema,
});

const personData = {
  name: 'Alice',
  age: 30,
  address: {
    street: '123 Main St',
    city: 'Exampleville',
    zipCode: '12345',
  },
};

const personResult = personSchema.validate(personData);
  1. 数组验证:
const itemSchema = Joi.object({
  name: Joi.string().required(),
  price: Joi.number().min(0).required(),
});

const cartSchema = Joi.array().items(itemSchema).min(1);

const cartData = [
  { name: 'Item 1', price: 10 },
  { name: 'Item 2', price: 20 },
];

const cartResult = cartSchema.validate(cartData);
  1. 异步验证
const asyncSchema = Joi.object({
  username: Joi.string().alphanum().min(3).max(30).required(),
  // 异步验证函数,返回 Promise
  isUsernameAvailable: Joi.function().async().required(),
});

const asyncData = {
  username: 'new_user',
  isUsernameAvailable: async (username) => {
    // 在实际应用中,可以查询数据库或调用 API 来检查用户名是否可用
    const isAvailable = await checkUsernameAvailability(username);
    if (!isAvailable) {
      throw new Error('Username is not available');
    }
  },
};

const asyncResult = await asyncSchema.validateAsync(asyncData);

五、Egg.js 集成 Joi

数据验证是 Web 应用程序开发中至关重要的一部分,它有助于保障输入数据的合法性和完整性。在 Egg.js 框架中,你可以借助 Joi 库来轻松进行数据验证。本文将介绍如何在 Egg.js 项目中使用 Joi 进行数据验证,以确保接收到的数据满足预期的格式和要求。

首先,在 app/controller 控制器目录下创建一个新的控制器文件,例如 user.js

// app/controller/user.js

const Controller = require('egg').Controller;
const Joi = require('joi');

class UserController extends Controller {
  async create() {
    const { ctx } = this;
    
    // 定义验证规则
    const schema = Joi.object({
      username: Joi.string().alphanum().min(3).max(30).required(),
      email: Joi.string().email().required(),
      age: Joi.number().integer().min(18).max(99),
    });

    // 获取请求体数据
    const requestBody = ctx.request.body;

    // 进行数据验证
    const validationResult = schema.validate(requestBody);

    if (validationResult.error) {
      ctx.status = 400;
      ctx.body = {
        message: '数据验证失败',
        details: validationResult.error.details,
      };
      return;
    }

    // 数据验证通过,继续处理业务逻辑
    // ...
  }
}

module.exports = UserController;

在上面的示例中,我们首先导入了 Joi 和 Egg.js 的 Controller 类。在 create 方法中,我们定义了验证规则 schema,然后获取请求体数据 requestBody 并进行数据验证。如果验证失败,我们返回一个包含错误信息的响应;如果验证通过,我们可以继续处理业务逻辑。

六、总结

Joi 是一个功能强大且易于使用的数据验证库,适用于各种 JavaScript 应用。通过定义清晰的验证规则,可以有效地确保输入数据的合法性,从而提高数据的质量和应用的稳定性。无论是简单的数据验证还是复杂的数据结构,Joi 都可以满足你的需求,让数据验证变得更加简单高效。
通过在 Egg.js 项目中集成 Joi 数据验证,你可以确保输入数据的合法性,并减少潜在的错误和安全风险。Joi 提供了简洁而灵活的验证规则定义,帮助你轻松应对不同类型的数据验证需求。

参考文档:https://joi.dev/


欢迎访问:天问博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/910506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

md5加密/md5加盐加密

maven <!--MD5加密 对铭文信息进行加密操作--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></dependency>工具类 import org.apache.commons.codec.binary.Hex;import java.security.Mess…

图像分割unet系列------TransUnet详解

图像分割unet系列------TransUnet详解 1、TransUnet结构2、我关心的问题3、总结与展望TransUnet发表于2021年,它是对UNet非常重要的改进,专为医学图像分割任务设计,特别用于在医学图像中分割器官或病变等解剖结构。 1、TransUnet结构 TransUNet在U-Net模型的基础上引入了混合…

第五章:平衡二叉树

系列文章目录 文章目录 系列文章目录前言1、平衡二叉树的介绍1.1 AVL树的概念1.2 AVL树的性质 2、平衡二叉树的插入2.1 平衡二叉树的插入步骤2.2 平衡二叉树的旋转2.2.1 左单旋2.2.2 右单旋2.2.3 左右双旋2.2.4 右左双旋 3、平衡二叉树的检验4、平衡二叉树的删除5、整体代码 前…

Java并发编程第5讲——volatile关键字(万字详解)

volatile关键字大家并不陌生&#xff0c;尤其是在面试的时候&#xff0c;它被称为“轻量级的synchronized”。但是它并不容易完全被正确的理解&#xff0c;以至于很多程序员都不习惯去用它&#xff0c;处理并发问题的时候一律使用“万能”的sychronized来解决&#xff0c;然而如…

Postman如何做接口自动化测试?

前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完…

v8引擎编译全过程

环境vs2019 cmd 命令行需要设置成为代理模式 set http_proxyhttp://127.0.0.1:10809 set https_proxyhttp://127.0.0.1:10809 这个必须带上&#xff0c;不然报错&#xff0c;告诉编译器win系统的模式 set DEPOT_TOOLS_WIN_TOOLCHAIN0 源码 GitHub: GitHub - v8/v8: The…

还不知道怎么提示LLM?ChatGPT提示入门

文章目录 简介&#xff1a;什么是人工智能&#xff1f;什么是提示过程&#xff1f;为什么会出现这样的差异&#xff1f; 为什么需要提示过程&#xff1f;1) 文章摘要2) 数学问题求解 如何进行提示过程&#xff1f;角色提示&#xff1a;多范例提示&#xff1a;无范例提示单范例提…

糖尿病视网膜病灶分割(Diabetic Retinopathy Multi-lesion Segmentation)-RTNet论文总结

论文&#xff1a;RTNet: Relation Transformer Network for Diabetic Retinopathy Multi-lesion Segmentation 目录 一、背景和出发点 二、创新点 三、方法实现 A. 概述 B. 全局transformer模块&#xff08;GTB&#xff09; C. 关系transformer模块&#xff08;RTB&#…

【Linux操作系统】深入探索Linux系统编程中的信号集操作函数

在Linux系统编程中&#xff0c;信号集操作函数是非常重要的工具&#xff0c;它们允许我们对信号进行管理和控制。本篇博客将详细介绍Linux系统编程中的信号集操作函数&#xff0c;包括信号集的创建、添加和删除信号&#xff0c;以及对信号集进行操作的常用函数。通过深入了解这…

华为Atlas的迭代关系、性能特点与典型应用场景

衔接上文&#xff0c;本篇主要讲解华为Atlas训练卡的迭代关系。以及迭代后的训练卡性能特点与典型应用场景。 Atlas 300T A2 训练卡的迭代关系为Atlas 300T Pro升级到Atlas 300T A2。相比之下&#xff0c;Atlas 300T A2 性能特点&#xff1a; ○ 高度集成 AI算力、通用算力、…

无人机巡检输电线路是什么,怎么巡?

在今日科技迅速发展的时代&#xff0c;无人机为输电线路巡检提供了一种高效、安全且准确的解决方案。那么&#xff0c;为什么无人机巡检输电线路如此关键呢&#xff1f;以下是对这一问题的深入剖析。 1. 提高工作效率 传统的巡检模式与现实挑战&#xff1a;在过去&#xff0c;输…

shell脚本语句(画矩形、三角形、乘法表和小游戏)(#^.^#)

目录 一、语句 一、条件语句 一、以用户为例演示 一、显示当前登录系统的用户信息 二、显示有多少个用户 二、单分支if 一、输入脚本 二、验证结果 三、双分支if 一、输入脚本 二、验证结果 四、多分支if 一、输入脚本 二、验证 二、循环语句 一、shell版本的循环…

【Freertos基础入门】深入浅出信号量

文章目录 前言一、Freertos的信号量是什么&#xff1f;二、二进制信号量和计数型信号量是什么&#xff1f;三、信号量初步了解1.二进制信号量的使用2.give和take是什么&#xff1f;3.为什么需要动态和静态创建的方式&#xff1f; 四、二进制信号量示例代码总结 前言 本系列基于…

docker之镜像与数据卷

镜像 简介 1.镜像是一种轻量级、可执行的独立软件包&#xff0c;用来打包软件运行环境和基于环境开发的软件&#xff0c;他包含运行某个软件所需的所有内容&#xff0c;包括代码、运行时库、环境变量、配置文件 2.将所有的应用和环境11&#xff0c;直接打包成docker镜像&…

健康检测智能睡眠床垫方案

《2022中国睡眠质量调查报告》调查结果显示&#xff0c;16&#xff05;的被调查者存在夜间睡眠时间不足6个小时&#xff0c;表现为24点以后才上床睡觉&#xff0c;并且在6点之前起床&#xff1b;有83.81&#xff05;的被调查者经常受到睡眠问题困扰&#xff0c;其中入睡困难占2…

文心一言 VS 讯飞星火 VS chatgpt (79)-- 算法导论7.4 4题

四、请用go语言&#xff0c;证明:RANDOMIZED-QUICKSORT 期望运行时间是 Ω(nlgn)。 文心一言&#xff1a; 首先&#xff0c;为了证明RANDOMIZED-QUICKSORT的期望运行时间是Ω(nlg n)&#xff0c;我们需要证明在最坏的情况下&#xff0c;该算法的运行时间是O(nlg n)。然后&…

无涯教程-PHP.INI File Configuration函数

PHP配置文件php.ini是影响PHP功能的最终且最直接的方法。每次初始化PHP时都会读取php.ini文件。换句话说,无论是模块版本的httpd重新启动还是CGI版本的每次脚本执行都重新启动。如果未显示您的更改,请记住停止并重新启动httpd。 该配置文件已注释完整。键区分大小写,关键字值不…

阿里云服务器-修改ecs操作系统,把window系统更换成Linux操作系统

其他sql格式也在更新中&#xff0c;可直接查看这个系列&#xff0c;要是没有你需要的格式&#xff0c;可在评论或私信我 总目录 目录-后期更新打算 hive的nvl中的子查询 总目录我这个是window&#xff0c;默认应该都是window&#xff0c;我需要改成Linux系统第一步&#xff…

浅谈搭建CobaltStrike云服务器可能会遇到的一些问题

1.文件上传 若要将本机的文件上传至云服务器&#xff0c;你需通过Xshell来实现 先在xshell连接云服务器&#xff0c;命令行中执行rz命令&#xff0c;即可实现文件上传 若没有rz命令,则需用到以下命令进行安装(二选一): 适用于redhat linux: yum install lrzsz适用于centos或u…

使用Mavon-Editor编辑器上传本地图片到又拍云云存储(Vue+SpringBoot)

需求&#xff1a;将本地的图片上传到服务器或者云存储中&#xff0c;考虑之后&#xff0c;这里我选的是上传到又拍云云存储。 技术背景&#xff1a; 前端&#xff1a;VueAjax 后端&#xff1a;SpringBoot 存储&#xff1a;又拍云云存储原理&#xff1a;Mavon-Editor编辑器有两个…