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

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

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

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

Joi

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

安装 Joi

javascript 复制代码
npm install joi

使用 Joi 进行数据验证

javascript 复制代码
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

javascript 复制代码
npm install express-joi-validation

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

javascript 复制代码
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 应用中实现数据验证,提高代码的健壮性和安全性。

相关推荐
梅子酱~4 分钟前
Vue 学习随笔系列二十三 -- el-date-picker 组件
前端·vue.js·学习
伟笑6 分钟前
elementUI 循环出来的表单,怎么做表单校验?
前端·javascript·elementui
辣辣y8 分钟前
React中useMemo和useCallback的作用:
前端·react
Alice-YUE28 分钟前
【HTML5学习笔记1】html标签(上)
前端·笔记·学习·html·html5
Alice-YUE29 分钟前
【HTML5学习笔记2】html标签(下)
前端·笔记·html·html5
确实菜,真的爱30 分钟前
electron进程通信
前端·javascript·electron
!win !2 小时前
uni-app小程序登录后…
前端·uni-app
Nightne2 小时前
CSS图片垂直居中问题解决方案
前端·css
魔术师ID2 小时前
vue 指令
前端·javascript·vue.js
凌冰_2 小时前
CSS3 变形
前端·css·css3