当前位置: 首页 > news >正文

Node.js中使用Joi 和 express-joi-validation进行数据验证和校验

在进行项目开发的过程中,很多时候系统对用户输入的数据会进行严格校验的,通常我们会以“前端校验为辅,后端校验为主”的思想进行校验处理。

后端接口校验的时候,是只能一直使用if进行逻辑判断呢,还是有更加方便的方法呢?很显然,一直使用if的话,会使得我们的代码可读性变差和不好维护。

在Node.js开发中,Joi 和 express-joi-validation 是两个非常有用的库,用于数据验证和校验。Joi 是一个强大的对象模式描述语言和验证器,而 express-joi-validation 是 Joi 的一个中间件,用于将 Joi 的验证功能集成到 Express 应用中。

Joi

Joi 是一个用于对象架构验证的库。它允许你定义对象的结构,包括类型、约束、默认值等,然后验证一个对象是否符合这个结构。

安装 Joi

npm install joi

使用 Joi 进行数据验证

const Joi = require('joi');
// 定义一个 schema
const userSchema = Joi.object({username: Joi.string().required(),password: Joi.string().min(6).required(),age: Joi.number().integer().min(18).required()
});
// 验证数据
const user = {username: 'testuser',password: 'password123',age: 25
};
const { error, value } = userSchema.validate(user);
if (error) {console.error('Validation failed:', error.details);
} else {console.log('Validation succeeded:', value);
}

express-joi-validation

express-joi-validation 是一个中间件,用于将 Joi 验证集成到 Express 应用中。它允许你定义路由参数、请求体和查询参数的验证规则。

安装 express-joi-validation

npm install express-joi-validation

使用 express-joi-validation 进行路由验证

const express = require('express');
const { validateRequest, validateBody, validateParams, validateQuery } = require('express-joi-validation');
const Joi = require('joi');
const app = express();
// 定义 schema
const userSchema = Joi.object({username: Joi.string().required(),password: Joi.string().min(6).required()
});
const userIdSchema = Joi.object({id: Joi.number().integer().required()
});
// 路由使用 validateBody 进行请求体验证
app.post('/users', validateBody(userSchema), (req, res) => {res.send('User created');
});
// 路由使用 validateParams 进行路由参数验证
app.get('/users/:id', validateParams(userIdSchema), (req, res) => {res.send(`User ID: ${req.params.id}`);
});
// 路由使用 validateQuery 进行查询参数验证
app.get('/users', validateQuery(Joi.object({limit: Joi.number().integer().min(1).max(100).default(10)
})), (req, res) => {res.send(`Users limit: ${req.query.limit}`);
});
// 捕获验证错误并返回响应
app.use((err, req, res, next) => {if (err.isJoi) {return res.status(400).send({message: err.details[0].message});}next(err);
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {console.log(`Server is running on port ${PORT}`);
});

总结

Joi 是一个强大的对象模式描述语言和验证器,用于定义和验证对象结构。

express-joi-validation 是一个中间件,将 Joi 的验证功能集成到 Express 应用中,支持对请求体、路由参数和查询参数的验证。

通过这两个库的结合使用,你可以轻松地在 Express 应用中实现数据验证,提高代码的健壮性和安全性。

相关文章:

Node.js中使用Joi 和 express-joi-validation进行数据验证和校验

在进行项目开发的过程中,很多时候系统对用户输入的数据会进行严格校验的,通常我们会以“前端校验为辅,后端校验为主”的思想进行校验处理。 后端接口校验的时候,是只能一直使用if进行逻辑判断呢,还是有更加方便的方法…...

InstructGPT:基于人类反馈训练语言模型遵从指令的能力

大家读完觉得有意义记得关注和点赞!!! 大模型进化树,可以看到 InstructGPT 所处的年代和位置。来自 大语言模型(LLM)综述与实用指南(Amazon,2023) 目录 摘要 1 引言 …...

jrc水体分类对水体二值掩码修正

使用deepwatermap生成的水体二值掩码中有部分区域由于被云挡住无法识别,造成水体不连续是使用jrc离线数据进行修正,jrc数据下载连接如下:https://global-surface-water.appspot.com/download 选择指定区域的数据集合下载如图: 使…...

营销/CDP/MA/SCRM

最近几年面向企业用户的营销系统,cdp,ma,scrm等发展迅速,下面就简单介绍一下这些系统。 架构图 架构图中显示了CDP,MA,SCRM的核心功能,其实还有基础底座的功能。 比如统一登录,权限…...

免费CDN加速,零成本提升网站速度!

1. 起因 免备案的服务器要么在海外,要么是国内通过内网穿透才能访问,这两种方法好处是免费,坏处是延迟太高,有的地区延迟能到四五百甚至超时,这样明显是不行的。 所以需套一个cdn来加速,在2024年&#xff0…...

2024-12-29-sklearn学习(25)无监督学习-神经网络模型(无监督) 烟笼寒水月笼沙,夜泊秦淮近酒家。

文章目录 sklearn学习(25) 无监督学习-神经网络模型(无监督)25.1 限制波尔兹曼机25.1.1 图形模型和参数化25.1.2 伯努利限制玻尔兹曼机25.1.3 随机最大似然学习 sklearn学习(25) 无监督学习-神经网络模型(无监督) 文章参考网站&a…...

RSA e与phi不互质(AMM算法进行有限域开根)

e与phi不互质 这一部分学习来自trup师傅的博客 针对CTFer的e与phi不互素的问题 - 跳跳糖 1&#xff1a;m^t<n from Crypto.Util.number import * from secret import flag flag bflag{*********} m bytes_to_long(flag) p getPrime(1024) q getPrime(1024) n p * q …...

网络物理互连

案例简介 美乐公司为新创建公司&#xff0c;公司现需要架设网络&#xff0c;需要下属分公司通过路由器与外网服务器联通&#xff0c;请使用Packet Tracer&#xff0c; 按照任务要求完成实验。实验中需配置设备或端口的IP地址。 1、绘制拓扑图 2、配置ip地址 3、配置路由ip R0 …...

论文研读:Text2Video-Zero 无需微调,仅改动<文生图模型>推理函数实现文生视频(Arxiv 2023-03-23)

论文名&#xff1a;Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Generators 1. 摘要 1.1 方法总结 通过潜空间插值, 实现动作连续帧。 以第一帧为锚定&#xff0c;替换原模型的self-attention&#xff0c;改为cross-attention 实现 保证图片整体场…...

服务端错误的处理和web安全检测

文章目录 I 服务端错误的处理业务返回码处理前端处理业务返回码nginx处理http状态码II web安全检测区分服务器类型主机扫漏III 使用 micro_httpd 搭建一个PHP站点步骤下载micro_httpd 并安装它配置micro_httpd 来服务PHP文件I 服务端错误的处理 服务端发生错误时,返回给前端的…...

鸿蒙TCPSocket通信模拟智能家居模拟案例

效果图 一、智能家居热潮下的鸿蒙契机 在当下科技飞速发展的时代&#xff0c;智能家居已如浪潮般席卷而来&#xff0c;深刻地改变着我们的生活方式。从能依据环境光线自动调节亮度的智能灯具&#xff0c;到可远程操控、精准控温的智能空调&#xff0c;再到实时监测健康数据的智…...

SQL-leetcode-197. 上升的温度

197. 上升的温度 表&#xff1a; Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是该表具有唯一值的列。 没有具有相同 recordDate 的不同行。 该表包…...

C++系列关键字static

文章目录 1.静态变量2.静态成员变量 1.静态变量 在C的&#xff0c;静态变量是一个非常有用的特性&#xff0c;它在程序执行期间只初始化一次&#xff0c;并在程序的整个执行期间都保持其值。 1.局部静态变量。定义在函数中&#xff0c;只初始化一次&#xff0c;不像普通的局部…...

使用Fn Connect之后,如何访问到其他程序页面?原来一直都可以!

前言 昨天小白讲过在飞牛上登录Fn Connect&#xff0c;就可以实现远程访问家里的NAS。 接着就有小伙伴咨询&#xff1a;如何远程访问到家里其他需要使用不同端口号才能访问到的软件&#xff0c;比如Jellyfin、Emby等。 这个小白在写文章的时候确实没有考虑到&#xff0c;因为…...

探索Composable Architecture:小众但高效的现代框架技术

近年来&#xff0c;随着应用规模和复杂性的不断提升&#xff0c;对开发效率和可维护性的要求也水涨船高。特别是在领域驱动设计 (DDD) 和反应式编程 (Reactive Programming) 的趋势影响下&#xff0c;一些小众但极具潜力的框架应运而生。本篇博客将深入探讨一种日益受到关注但尚…...

改投论文时如何重构

摘要: 不同期刊和会议对于论文的风格、页数限制等方面有一些差别, 论文在某个地方被拒, 改投别处时需要进行重构. 本贴描述重构的基本方案. 你的衣柜乱糟糟的, 如何清理呢? 方案 A. 把不喜欢的衣服一件件丢掉.方案 B. 把衣服全部丢出来, 然后再把喜欢的衣服一件件放进去. 对…...

P8打卡——YOLOv5-C3模块实现天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, dat…...

基于微信小程序的校园点餐平台的设计与实现(源码+SQL+LW+部署讲解)

文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…...

PyTorch快速入门教程【小土堆】之完整模型训练套路

视频地址完整的模型训练套路&#xff08;一&#xff09;_哔哩哔哩_bilibili import torch import torchvision from model import * from torch import nn from torch.utils.data import DataLoader# 准备数据集 train_data torchvision.datasets.CIFAR10(root"CIFAR10&…...

【AIGC】 ChatGPT实战教程:如何高效撰写学术论文引言

&#x1f4a5; 欢迎来到我的博客&#xff01;很高兴能在这里与您相遇&#xff01; 首页&#xff1a;GPT-千鑫 – 热爱AI、热爱Python的天选打工人&#xff0c;活到老学到老&#xff01;&#xff01;&#xff01;导航 - 人工智能系列&#xff1a;包含 OpenAI API Key教程, 50个…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...