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

相关推荐
hunterandroid8 小时前
[鸿蒙从零到一] HarmonyOS 地图、定位与传感器能力实战:从位置获取到运动感知
前端
大锅盖18 小时前
Web 工单要调用相机,第一步不是打开取景框,而是建立能力门禁
前端·数码相机·harmonyos
fthux8 小时前
不必下载整个仓库:GitZip Pro 让 GitHub 文件与文件夹批量下载更简单
前端·chrome·ai·edge·开源·github·firefox
奥莱维8 小时前
【无标题】
java·前端·javascript
用户921080262868 小时前
0. 为什么我们的项目选择 Cesium:从三维地图、离线部署到工程代价
前端
阿懂在掘金8 小时前
同一份弹窗我重构了三次:从 v-model 地狱到路由式调用,终于治好了模板臃肿
前端·vue.js·前端框架
悟空瞎说8 小时前
从 CRA 到 Vite:含 Cesium 的真实项目迁移实战记录
前端
悟空瞎说8 小时前
Vite 中零配置接入 Cesium.js:vite-plugin-cesium-engine 深度解析
前端
To_OC9 小时前
后端接口还没交付,前端如何独立把整套业务跑通
前端·react.js·全栈
王琦03189 小时前
WEB服务
前端