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

Node.js 》》数据验证 Joi 、express-joi

express-joi、joi

 joi是nodej的一个工具模块,主要用于JavaScript对象的校验。它是一种简单易用的javacript对象约束描述语言,可以轻松解决nodejs开发中的各种参数的校验。1. string()    			    值必须是字符串2. alphanum()   				值只能包含a-zA-Z的字符串3. min(n)       				最小长度4. max(n)       				最大长度5. required    			    值必填项,   不能为  undefined6. pattern(正则表达式)           值必须符号正则表达式
express-joi 是一个基于 Joi 的中间件,用于在 Express 应用中进行参数验证。它可以帮助我们验证请求中的 body、query 和 params 数据,确保数据的有效性和安全性。
#  安装npm install @escook/express-joinpm install joi
#  导入const express = require('express');const app = express();const Joi = require('joi');const expressJoi = require('@escook/express-joi');	
# 定义验证规则const userSchema = {body: {username: Joi.string().alphanum().min(3).max(12).required(),password: Joi.string().pattern(/^[\S]{6,15}$/).required(),repassword: Joi.ref('password')},query: {name: Joi.string().alphanum().min(3).required(),age: Joi.number().integer().min(1).max(100).required()},params: {id: Joi.number().integer().min(0).required()}}
# 使用中间件进行验证  // 数据验证通过之后,会把这次请求流转给后面的路由处理函数// 数据验证失败 ,  终止后续代码执行,并抛出一个 全局Error 错误,进入全局错误中间件中app.post('/adduser/:id', expressJoi(userSchema), function(req, res) {const body = req.body;res.send(body);})
# 错误处理app.use(function(err, req, res, next) {if (err instanceof Joi.ValidationError) {return res.send({ status: 1, message: err.message });}res.send({ status: 1, message: err.message });})
# 启动服务app.listen(3001, function() {console.log('Express server running at http://127.0.0.1:3001');})

案例

》》》创建验证规则文件 (schema/user.js)

// schema/user.js
const joi = require('joi')// 用户注册和登录表单的验证规则
const username = joi.string().alphanum().min(3).max(12).required()
const password = joi.string().pattern(/^[\S]{6,15}$/).required()
const email = joi.string().email().required()// 注册和登录表单的验证规则对象
exports.reg_login_schema = {// 表示对 req.body 中的数据进行验证body: {username,password,email}
}// 更新用户信息验证规则
exports.update_userinfo_schema = {body: {id: joi.number().integer().min(1).required(),nickname: joi.string().required(),email: joi.string().email().required()}
}// 更新密码验证规则
exports.update_password_schema = {body: {oldPwd: password,newPwd: joi.not(joi.ref('oldPwd')).concat(password)}
}// 更新头像验证规则
exports.update_avatar_schema = {body: {avatar: joi.string().dataUri().required()}
}

》》创建路由文件 (routes/user.js)

// routes/user.js
const express = require('express')
const router = express.Router()
const expressJoi = require('@escook/express-joi')
//  路由处理模块
const userHandler = require('../handler/user')
const { reg_login_schema,update_userinfo_schema,update_password_schema,update_avatar_schema
} = require('../schema/user')// 注册新用户
router.post('/register', expressJoi(reg_login_schema), userHandler.register)// 登录
router.post('/login', expressJoi(reg_login_schema), userHandler.login)// 更新用户基本信息
router.post('/userinfo', expressJoi(update_userinfo_schema), userHandler.updateUserInfo)// 重置密码
router.post('/updatepwd', expressJoi(update_password_schema), userHandler.updatePassword)// 更新头像
router.post('/update/avatar', expressJoi(update_avatar_schema), userHandler.updateAvatar)module.exports = router

》》创建控制器文件 (handler/user.js)

// handler/user.js
exports.register = (req, res) => {// 这里的 req.body 数据已经通过验证res.send({status: 0,message: '注册成功!',data: req.body})
}exports.login = (req, res) => {res.send({status: 0,message: '登录成功!',data: req.body})
}exports.updateUserInfo = (req, res) => {res.send({status: 0,message: '更新用户信息成功!',data: req.body})
}exports.updatePassword = (req, res) => {res.send({status: 0,message: '更新密码成功!',data: req.body})
}exports.updateAvatar = (req, res) => {res.send({status: 0,message: '更新头像成功!',data: req.body})
}

》》创建主应用文件 (app.js)

// app.js
const express = require('express')
const app = express()// 配置解析表单数据的中间件
app.use(express.urlencoded({ extended: false }))
app.use(express.json())// 导入并注册用户路由模块
const userRouter = require('./routes/user')
app.use('/api', userRouter)// 错误中间件
app.use((err, req, res, next) => {// 数据验证失败if (err instanceof joi.ValidationError) {return res.send({status: 1,message: err.message})}// 未知错误res.send({status: 1,message: err.message})
})// 启动服务器
app.listen(3000, () => {console.log('server running at http://127.0.0.1:3000')
})

高级验证案例

》》自定义验证消息

// schema/user.js
exports.reg_login_schema = {body: {username: joi.string().alphanum().min(3).max(12).required().messages({'string.base': '用户名必须是字符串','string.alphanum': '用户名只能包含字母和数字','string.min': '用户名长度不能小于3','string.max': '用户名长度不能大于12','any.required': '用户名是必填项'}),password: joi.string().pattern(/^[\S]{6,15}$/).required().messages({'string.base': '密码必须是字符串','string.pattern.base': '密码长度6-15位,不能包含空格','any.required': '密码是必填项'})}
}

》》条件验证

// schema/user.js
exports.update_userinfo_schema = {body: {id: joi.number().integer().min(1).required(),nickname: joi.string().required(),email: joi.string().email().required(),// 只有 is_vip 为 true 时才需要验证 vip_expire 字段is_vip: joi.boolean(),vip_expire: joi.when('is_vip', {is: true,then: joi.date().required(),otherwise: joi.optional()})}
}

》》数组验证

// schema/product.js
const joi = require('joi')exports.add_product_schema = {body: {name: joi.string().required(),price: joi.number().min(0).required(),// 验证数组tags: joi.array().items(joi.string().valid('新品', '热销', '折扣')).min(1).required(),// 验证对象数组specs: joi.array().items(joi.object({name: joi.string().required(),value: joi.string().required()})).min(1).required()}
}
http://www.dtcms.com/a/321889.html

相关文章:

  • 【数字图像处理系列笔记】Ch06:图像压缩
  • 数据结构5-哈希表
  • 板卡如何安装在主机系统(刀片服务器或计算节点)
  • Linux之shell脚本入门
  • Unity基于Recoder的API写了一个随时录屏的工具
  • http状态码403,404,500等是什么意思?
  • Cursor CLI 来了,准备 Build anything
  • Sum of Three Values(sorting and searching)
  • 全面了解selenium
  • RSA非对称加密
  • 除了腾讯会议,私有化有哪些选择?
  • 安科瑞EMS3.0源网荷储一体化解决方案 全面助力零碳园区建设
  • FreeSWITCH parse-all-invite-headers
  • 记一次lombok链式调用引发EasyExcel兼容性的问题
  • 记录网站突然报错503
  • 第六章第四节 PWM驱动LED呼吸灯 PWM驱动舵机 PWM驱动直流电机
  • 计算机网络:到底什么是可变长子网掩码VLSM?
  • win11中Qt5.14.0+msvc2019+opencv4.9配置
  • 全方位无限随机地图实现指南
  • 模块 PCB 技术在未来通信领域的创新突破方向
  • Docker 创建镜像错误记录
  • Java技术栈/面试题合集(21)-Docker篇
  • 如何动态执行 JS 脚本
  • 揭秘Java synchronize:轻量级锁升级与偏向锁
  • Java-注解
  • 重新 mybatis plus 的 撒着OrUpdate 方法,实现根据自定义字段插入或者修改
  • P1044 [NOIP 2003 普及组] 栈
  • B4263 [GESP202503 四级] 荒地开垦 题解
  • 【工作笔记】Docker Desktop一直转圈加载不出来然后报错
  • 提升LLM服务效率的秘密武器——vLLM!