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

express-validator 数据校验详解

`express-validator` 是一个用于在 Express 应用中进行数据验证和清理的中间件。

一、安装

# 使用 npm 安装npm install express-validator

二、基本使用

1. 引入和初始化

const express = require("express");const { body, validationResult } = require("express-validator");const app = express();app.use(express.json());// 定义一个验证中间件数组const validateUser = [body("name").notEmpty().withMessage("Name is required"),body("email").isEmail().withMessage("Invalid email address"),body("age").isInt({ min: 18 }).withMessage("Age must be at least 18"),];// 处理 POST 请求的路由app.post("/users", ...validateUser, (req, res) => {// 检查验证结果const errors = validationResult(req);if (!errors.isEmpty()) {return res.status(400).json({ errors: errors.array() });}// 若验证通过,处理数据const { name, email, age } = req.body;res.status(201).json({ message: "User created successfully", user: { name, email, age } });});const port = 3000;app.listen(port, () => {console.log(`Server running on port ${port}`);});

三、常用验证规则

1. 字符串验证

body("name").notEmpty().withMessage("Name is required");body("password").isLength({ min: 6 }).withMessage("Password must be at least 6 characters");body("phone").isMobilePhone().withMessage("Invalid phone number");

2. 数字验证

body("age").isInt({ min: 18, max: 100 }).withMessage("Age must be between 18 and 100");body("price").isFloat({ min: 0 }).withMessage("Price must be a non-negative number");

3. 邮箱和 URL 验证

body("email").isEmail().withMessage("Invalid email address");body("website").isURL().withMessage("Invalid URL");

4. 自定义验证

body("username").custom((value) => {// 假设这里检查用户名是否已存在// 实际应用中需要查询数据库const existingUsernames = ["admin", "guest"];if (existingUsernames.includes(value)) {throw new Error("Username already exists");}return true;});

使用 `custom` 方法定义自定义的验证规则。

四、错误处理

验证结果可以通过 `validationResult(req)` 获取,它返回一个 `ValidationResult` 对象。可以使用该对象的方法来处理验证错误。

1. `isEmpty()`

用于检查是否存在验证错误,若没有错误返回 `true`,否则返回 `false`。

2. `array()`

返回一个包含所有验证错误信息的数组,每个错误对象包含 `location`(错误发生的位置,如 `body`)、`msg`(错误消息)、`param`(出错的字段名)等属性。

3. `formatWith()`

可以自定义错误信息的格式。

const errors = validationResult(req).formatWith(({ msg }) => msg);if (!errors.isEmpty()) {return res.status(400).json({ errors: errors.array() });}

五、链式调用和清理

`express-validator` 支持链式调用,可以在验证规则后添加清理规则。`trim()` 用于去除字符串两端的空格,`escape()` 用于对特殊字符进行转义,防止 XSS 攻击。

body("name").trim().escape().notEmpty().withMessage("Name is required");

相关文章:

express-validator 数据校验详解

express-validator 是一个用于在 Express 应用中进行数据验证和清理的中间件。 一、安装 # 使用 npm 安装npm install express-validator 二、基本使用 1. 引入和初始化 const express require("express");const { body, validationResult } require("ex…...

使用VSCODE开发C语言程序

使用vscode配置C语言开发环境 一、安装VSCODE 1、下载vscode ​ 从官方网站(https://code.visualstudio.com/Download)上,下载windows版本的vscode 2、安装vscode ​ 下载完毕后,按照提示进行安装即可(尽可能不要安…...

Python学习心得常用的内置函数

常用的内置函数: 1.数据类型转换函数: 描述说明 描述说明 bool(obj) 获取指定对象 obj 的布尔值 str(obj) 将指定对象 obj 转成字符串类型 int(x) 将 x 转成 int 类型 float(x) 将 x 转成 float 类型 list(sequence) 将序列转成列表类型 tu…...

【数据结构初阶第十二节】设计循环队列

云边有个稻草人-CSDN博客 必须有为成功付出代价的决心,然后想办法付出这个代价。 还有最后一道关于队列的习题,这题有点难,准备好迎接挑战吧! 目录 1.【题目】 2.实现循环队列推荐用数组,Why? 3.Q1:如…...

【数据分享】1929-2024年全球站点的逐年降雪深度数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2024年全球气象站…...

【强化学习的数学原理】第10课-Actor-Critic方法-笔记

学习资料:bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接:强化学习的数学原理 西湖大学 赵世钰 文章目录 一、最简单的Actor-Critic(QAC)二、Advantage Actor-Critic(A2C)三、重要性采样和…...

scratch猜年龄互动小游戏 2024年12月scratch四级真题 中国电子学会 图形化编程 scratch四级真题和答案解析

scratch猜年龄互动小游戏 2024年12月电子学会图形化编程Scratch等级考试四级真题 一、题目要求 老爷爷的年龄是1-100的随机数,老爷爷询问“请猜猜我的年龄是多少?”,输入年龄,老爷爷会回答"大了"或者"小了,直到最后成功猜出年龄。 1、准备工作 (1)删…...

javaSE学习笔记23-线程(thread)-总结

创建线程的三种方式 练习代码 package com.kuang.thread;import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask;//回顾总结线程的创建 public class ThreadNew {public static void main(String[…...

Boringssl介绍

BoringSSL 是 Google 从 OpenSSL 分支出来的一个开源 TLS/SSL 库,旨在为 Google 的产品和服务提供一个更加轻量、安全和现代化的加密库。它是 OpenSSL 的一个替代品,专注于简化代码、提高安全性和减少潜在的攻击面。 以下是对 BoringSSL 的详细介绍&…...

java每日精进 2.13 MySql迁移人大金仓

1.迁移数据库 1. 数据库创建语句 MySQL: CREATE DATABASE dbname; 人大金仓(Kingbase): 在人大金仓中,CREATE DATABASE 的语法通常相同,但可能需要特别注意字符集的指定(如果涉及到多语言支持…...

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一种新型元启发式算法,其灵感来源于雪雁的迁徙行为,特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…...

C++中为什么有了tuple还需要pair?

在C中,tuple和pair都是用于存储多个值的工具。tuple可以存储任意数量的元素,而pair只能存储两个元素。既然tuple的功能更强大,为什么C标准库仍然保留了pair呢?本文将从多个角度探讨这个问题。 1. 历史兼容性 pair在C标准库中比tu…...

Open WebUI项目源码学习记录(从0开始基于纯CPU环境部署一个网页Chat服务)

感谢您点开这篇文章:D,鼠鼠我是一个代码小白,下文是学习开源项目Open WebUI过程中的一点笔记记录,希望能帮助到你~ 本人菜鸟,持续成长,能力不足有疏漏的地方欢迎一起探讨指正,比心心&#xff5e…...

什么是Grok-3?技术特点,场景,潜在问题与挑战

Grok-3 的技术特点与优势 1. 超大算力与训练规模 算力投入:Grok-3 使用了 20 万块英伟达 H100 GPU,分两个阶段训练(第一阶段 10 万 GPU 训练 144 天,第二阶段 20 万 GPU 训练 92 天),总计算量是前代 Grok-2 的 10 倍。这种规模远超同期其他项目(如印度的 1.8 万 GPU 公…...

容器docker k8s相关的问题汇总及排错

1.明确问题 2.排查方向 2.1、 docker方面 docker logs -f 容器ID docker的网络配置问题。 2.2、 k8s方面 node组件问题 pod的问题(方式kubectl describe po pod的名称 -n 命名空间 && kubectl logs -f pod的名称 -n 命名空间) 调度的问题&#x…...

【Docker】百度网盘:基于VNC的Web访问及后台下载

本教程通过 Docker Compose 部署百度网盘的 VNC 版本,实现24小时不间断下载、双模式访问、数据持久化、自动重启和安全加密控制等核心功能。 目录结构规划 建议使用以下目录结构(可根据实际情况调整): ~/baidunetdisk/├── d…...

JWT 令牌

目录 一、JWT 1、什么是JWT 2、JWT的组成 3、JJWT签发与验证token 1、创建token 2、解析token 3、设置过期时间 4、自定义claims 前言: 在现代Web应用和微服务架构中,用户身份验证和信息安全传输是核心问题。JSON Web Token(J…...

鼎捷PLM深度集成DeepSeek,领跑智能研发新赛道

新年伊始,DeepSeek以其卓越的性能、高性价比和开源优势,掀起一股AI技术应用热潮,重塑各行各业的知识管理、知识应用模式。对制造业来说,首当其冲的就是研发管理变革,这也引发了企业的深度思考:在工业领域的…...

设计模式之适配模式是什么?以及在Spring AOP中的拦截器链的使用源码解析。

前言 本文涉及到适配模式的基本用法,以及在Spring AOP中如何使用,首先需要了解适配模式的工作原理,然后结合Spring AOP的具体实现来详细详细解析源码。 首先,适配模式,也就是Adapter Pattern,属于结构型设计…...

挖掘图片的秘密:如何用piexif提取和修改Exif数据

Exif(Exchangeable Image File Format)数据是一个广泛用于数字图像(尤其是JPEG和TIFF格式)中的元数据格式。它包含了关于图像的各种信息,包括拍摄设备的类型、拍摄时间、光圈、曝光时间、GPS定位信息等。Exif数据使得用…...

javaSE学习笔记22-线程(thread)-线程通信、线程池

线程通信 应用场景:生产者和消费者问题 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待&#xff0c…...

VMware新建虚拟机

看看自己的电脑是什么内核,有几个处理器 再分配给虚拟机 镜像文件需要自己安装下载地方https://mirrors.aliyun.com/centos/?spma2c6h.13651104.d-2001.8.3fb1320cuI1jeS 然后就出现了 然后开启虚拟机,等待 等待之后如下,选择语言 等待一段时…...

Windows 11运行《拳皇98UM》等老游戏闪退解决方案

问题:游戏可以进入选项菜单,但只要进行键盘操作就会卡死并闪退。 问题分析:该游戏兼容DirectX 9,但可能不向上兼容。而Windows 11默认安装的是DirectX 12,并不兼容低版本的DirectX,这可能导致该游戏或其他…...

使用iOS个人声音与SoVITS训练个人AI语音(10分钟快速上手)

使用iOS个人声音与SoVITS训练个人AI语音(10分钟快速上手) 序言:最近在抖音上频繁看到曼波唱歌的视频和各种AI语音的搞笑短片,加上年后新购置的M2硬盘终于提供了足够的存储空间,让我有机会深入研究AI语音训练。24年年初…...

【JavaEE进阶】Spring MVC(3)

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗 如有错误,欢迎指出~ 返回响应 返回静态页面 //RestController Controller RequestMapping("/response") public class ResponseController {RequestMapping("/returnHtmlPage&…...

火语言RPA--Excel读取内容

【组件功能】:读取Excel内指定位置的内容或读取整篇Sheet页内容 配置预览 配置说明 读取位置 单元格:读取指定单元格中的内容。 行:读取指定行内容。 列:读取指定列内容。 区域:读取指定区域内容。 整篇sheet页&…...

sass报错:[sass] Undefined variable. @import升级@use语法注意事项

今天创建vue3项目,迁移老项目代码,使用sass的时候发现import语法已经废弃,官方推荐使用use替换。 这里我踩了一个坑找半天的问题,原因是sass升级到1.85之后 定义变量前加上 - 就是表示变量私有,即使使用use导出 在新的…...

DeepSeek VS ChatGPT-速度、准确性和成本

撰写本文时马斯克刚刚发布了聊天机器人Grok2,10万张算卡体现了马斯克的财大气粗。近年来,人工智能模型取得了长足的发展,每个模型都力求在速度、准确性和成本效率方面超越其他模型。在本文中,我将深入研究比较中美在AI的焦点模型上…...

重新出发的LLM本地部署——DeepSeek加持下的Ollama+OpenWebUI快速部署

DeepSeek 这真的是太惊艳了,发布出来的模型这么能打,在线的版本使用起来也是丝滑连招,感觉效果比起之前一直用智谱 chatglm4 更好用,想着本地化部署一下。 本来以为,会和之前在开发测试 transformers 的模型和代码一样…...

动态网格图片展示中的自适应逻辑

在现代网页设计中,自适应逻辑不仅提升了用户体验,也显著提高了组件的灵活性。本文将探讨如何通过 动态计算每页图片数 和 窗口尺寸变化监听 来实现网格图片的自适应展示。以下内容不仅包含逻辑的核心,还展示了如何优雅地将这些逻辑与 Vue 框架…...