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'
要配置 `@escook/express-joi` 中间件以控制未指定规则字段的行为,可以通过设置 Joi 的 `stripUnknown` 选项来实现。默认情况下,Joi 允许请求中包含未在验证规则中定义的字段,但不会对这些字段进行验证。若希望阻止这些字段通过验证,需将 `stripUnknown` 设置为 `false`,这样当请求中包含未定义字段时,验证将失败并返回错误信息。 在实际应用中,可以在调用 `expressJoi` 中间件时,通过 `options` 参数传递 Joi 的配置选项。以下是一个具体的配置示例: ```javascript const express = require('express'); const expressJoi = require('@escook/express-joi'); const Joi = require('joi'); const app = express(); // 配置解析表单数据的中间件 app.use(express.urlencoded({ extended: false })); app.use(express.json()); // 定义 Joi 验证规则 const schema = { body: { username: Joi.string().required(), age: Joi.number().integer().min(18).required() } }; // 使用 express-joi 中间件并配置 stripUnknown 为 false app.post('/user', expressJoi({ schema: schema, options: { stripUnknown: false // 禁止未定义字段通过 } }), (req, res) => { res.send('Validation passed'); }); // 错误处理中间件 app.use((err, req, res, next) => { if (err instanceof Joi.ValidationError) { return res.status(400).send({ status: 1, message: err.message }); } res.status(500).send({ status: 1, message: 'Internal Server Error' }); }); // 启动服务器 app.listen(3000, () => { console.log('Server is running at http://127.0.0.1:3000'); }); ``` 上述代码中,如果客户端发送的请求体中包含如 `email` 等未在 `schema` 中定义的字段,中间件将抛出验证错误,并通过错误处理中间件返回相应的错误信息[^1]。 此外,还可以通过设置 `abortEarly: false` 来收集所有验证错误,而不是在遇到第一个错误时立即终止验证流程。这样有助于一次性返回所有字段的验证错误信息,提升调试效率。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰灰学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值