当前位置: 首页 > 工具软件 > joi-router > 使用案例 >

nodejs后端接口参数格式校验——Joi

彭华皓
2023-12-01

在nodejs做后端开发的过程中,尤其是基于Restful的API服务,在前端发起请求的时候,如果没有对参数的校验,很容易在接口联调测试阶段出现各种上传参数名称错误/格式错误/字段遗漏等情况,这时候前后端工程师不得不一起去排查问题,有时候一个单词的拼写错误会造成大量的时间浪费,笔者在阅读《hapi.js实战》的时候了解到Joi这个包,感觉非常好用,于是团队引入了express的研发框架中,真的是好用,下面不多说,直接上代码。

Joi文档地址点击跳转

Joi基本使用示例:

常用方法

let paramSchema = Joi.object().keys({ 
    // 3 - 30 个 数字、字符 
    username: Joi.string().alphanum().min(3).max(30).required(), 

    // 3 - 30 位 字母数字组合密码 
    password: Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/), 

    // string || number 都可以通过 
    access_token: [Joi.string(), Joi.number()], 

    // 生日限制 
    birthyear: Joi.number().integer().min(1900).max(2018), 

    // email 限制 
    email: Joi.string().email(), 

    // URI限制 
    website: Joi.string().uri({ scheme: [ 'git', /git+https?/ ] }), 

    // ==== 允许为空/ 否认不允许为空 ==== 
    search: Joi.string().allow(''), 

    // 验证枚举值,如果不传,默认为all 
    type: Joi.string().valid('disabled', 'normal', 'all').default('all'), 

    // 开始时间 会自动格式化 
    startTime: Joi.date().min('1-1-1974').max('now'), 

    // 结束时间 必须大于开始时间,小于2100-1-1 
    endTime: Joi.when(Joi.ref('startTime'), { is: Joi.date().required(), then: Joi.date().max('1-1-2100') }), 
    
    // 页码 限制最小值 
    page: Joi.number().integer().min(1).default(1), pageSize: Joi.number().integer().default(8), 
    // deleteWhenLtTen: Joi.number().integer().max(10).strip(), 
   
    // 数组中包含某个字段 && 数字 
    arrayString: Joi.array().items( 
        // 数组中必须包含 name1 
        Joi.string().label('name1').required(), 
        // 数组中必须包含 数字 
        Joi.number().required(), 
        // 除掉【以上类型的以外字段】---数组中可以包含其他类型,如bool
        Joi.any().strip() 
    ), 

    // 数组对象, 如需其参考以上字段 
    arrayObject: Joi.array().items( 
        Joi.object().keys({ 
            age: Joi.number().integer().max(200), 
            sex: Joi.boolean() 
        }) 
    ) 

    with('isA', 'AVal') //意思是,isA 和 AVal 这两字段如果填写了isA,也必须要填写AVal
    with('isB', 'BVal') //道理同上
    without('isA', 'isB'); //意思是 isA 和 isB 只能填写其中一个    
    or('isA', 'isB') //意思是 isA 和 isB 这两字段至少填写其一
    // 测试数据
    const testData = { Password: "12345678"}
    // 验证
    let value = Joi.validate(testData, paramSchema, { allowUnknown: true, abortEarly: true });
    console.log(value);
    if (value.error) { throw error; }
复制代码


在express中的使用代码示例:

以新增用户接口的route层为例

"use strict"const express = require('express');const router = express.Router();const Joi = require('joi');require('joi-router');
/** * * 新增用户 * @param userAccount 账号名称 * @param pwd 密码 * @param userDesc 用户其他信息 */router.post('/add',{    body: {    // 对req.body下的参数进行校验        userAccount: Joi.string().required(),        userDesc: Joi.string().required(),        pwd: Joi.string().required()    }} , async function (req,res) {

    ... 其他逻辑代码 ...

    res.json(result);});
复制代码


欢迎交流咨询,如若有更好的系统建设意见,欢迎不吝赐教!


 类似资料: