前言
在基于Node.js Express框架的后端API开发中我想使用一个可以粗略快速验证前端发来的表单数据的工具包,就此发现了joi的存在,joi真的很不错,但它的正则表达式做的貌似并不怎么好。
因为要保持Express高度统一的规范,所以我想通过中间件的方式来验证数据,但是并没有发现基于目前joi@17.9.2
版本的包,故此我开发了@yassine-zhang/express-joi
这么一个包。
如何使用?
安装
npm install @yassine-zhang/express-joi
导入joi包,创建基础验证条件
在下面代码中我简单创建了验证条件,注意:这些都是joi@17.9.2最新用法
joi.object()
-创建验证条件
object.with()
-必须且只允许验证时传来哪些数据键
const joi = require('joi')
const username = joi.string().alphanum().min(3).max(8).required()
const password = joi.string().pattern(/^[\S]{6,12}$/)
reg_user_schema = joi.object({
username,
password
}).with('username', 'password')
注册中间件
当我们验证req.body内数据条件通过后即可继续运行后面路由(默认验证请求体内数据)
如果我们需要获取到请求体内数据的话请自行添加内置全局中间件:express.json()或express.urlencoded({extended: false}),又或者有其他需求。
const express = require('express')
const expressJoi = require(‘@zhangsir/express-joi’)
const app = express()
app.post('/reguser', expressJoi.validate(reg_user_schema), (req, res) => {
...
})
添加校验失败错误级别中间件
// 注册辅助反馈响应数据的方法
app.use((req, res, next) => {
// status = 0 为成功,status = 1 为失败; 默认status = 1,方便处理失败的情况
res.cc = (err, status=1) => {
res.send({
// 状态
status,
// 状态描述, 判断err是错误对象还是字符串
message: err instanceof Error ? err.message : err
})
}
next()
})
// 注册全局错误级别中间件
app.use((err, req, res, next) => {
// 错误实例类型为 ValidationError , 表单数据校验失败
if (err instanceof joi.ValidationError) return res.cc(err)
// 未知报错
res.cc(err)
})
换源
验证时要从哪里拿数据?body?query? or params?
我们默认在验证时要拿 req.body
的数据,当然在调用验证中间件函数的时候可以传入第二个参数来更换数据源,只在你当前位置验证时有效
案例
如下案例可以在验证时使用 req.params
,也就是Express框架URL上的动态参数
app.post('/reguser', expressJoi.validate(reg_user_schema, 'params'), (req, res) => {
...
})
当然我们可以传入body
| query
| params
body
就是默认的,不需要填,如果填写query
,就是获取的URL中查询字符串
联系
- QQ:57878778
- BlogSite: reports.org.cn