关于EGG项目添加Joi参数校验解决方案

使用Joi来对egg项目进行参数校验

Joi是什么

Joi?是 hapijs 自带的数据校验模块,高度封装常用的参数校验功能.?Joi文档

项目中引入Joi

将Joi挂载在app对象下,? app.js

const Joi = require('@hapi/joi');
const path = require('path');
class AppBootHook {
    constructor(app) {
        this.app = app;
        const directory = path.join(app.config.baseDir, 'app/validator');
        app.Joi = Joi;
        app.loader.loadToApp(
            directory,
            'validator'
        );
    }
}

module.exports = AppBootHook;

新建Joi校验文件

base_contoller文件下添加Joi拦截

const { Controller } = require('egg');
class BaseController extends Controller {
    constructor(request, response, app) {
        super(request, response, app);
        this.options = {
            //允许存在不在 schema 中的字段
            allowUnknown: true,
            //过滤不存在 schema 中的字段
            stripUnknown: true,
            //可以在检测到第一个错误时立即返回,默认false(检查全部)
            abortEarly: true,
            //可以尝试将值转换为所需的类型(例如,将字符串转换为数字)
            convert: true,
            messages: {
                'any.required': '{{#label}}不能为空',
                'number.base': '{{#label}}参数错误',
                'string.base': '{{#label}}参数错误'
            }
        };
    }
    assert(schema, params) {
        const Joi = this.app.Joi;
        const result = Joi.object(schema).validate(params, this.options);
        if (result.error) {
            throw new Error(result.error.details[0].message);
        }
    }
}

module.exports = BaseController;

添加中间件进行参数拦截校验

/**
 * 统一错误处理
 * @param options {*}
 * @param app
 * @returns {errorHandler}
 */
module.exports = (options, app) => {
    return async function errorHandler(ctx, next) {
        try {
            await next();
        } catch (err) {
            ctx.error = err;
            let message = err.message;
            if (err.status === 500) {
                app.logger.error(err);
                message = err.stack;
                if (app.config.env === 'prod') {
                    message = '服务暂时不可用,正在努力修复中。';
                }
            }
            ctx.status = err.status || 200;
            ctx.body = {
                code: 1,
                message,
                status: ctx.status
            };
        }
    };
};

contorller使用方法

以获取主题列表接口为例

 // 获取主题列表
  this.assert(
      {
        forumId: this.app.Joi.number().required().label('版块ID')
      },
 this.ctx.query);

原文地址:https://www.cnblogs.com/Lewiskycc/p/12118577.html

时间: 2024-08-29 23:00:23

关于EGG项目添加Joi参数校验解决方案的相关文章

crm 系统项目(一) 登录,注册,校验

crm 系统项目(一) 登录,注册,校验 首先创建一个Django项目,关于配置信息不多说,前面有~ models.py文件下创建需要的表格信息,之后导入数据库 from django.db import models from multiselectfield import MultiSelectField course_choices = (('Linux', 'Linux中高级'), ('PythonFullStack', 'Python高级全栈开发'),) class_type_choi

eggjs的参数校验模块egg-validate的使用和进一步定制化升级

简单讲一下这个egg-validate egg-validate是基于parameter的. 安装 npm install --save egg-validate 启用 // config/plugin.js exports.validate = { enable: true, package: 'egg-validate', }; 配置 // config/config.default.js exports.validate = { // convert: false, // validate

Spring Boot2 系列教程 (十五) | 服务端参数校验之一

估计很多朋友都认为参数校验是客户端的职责,不关服务端的事.其实这是错误的,学过 Web 安全的都知道,客户端的验证只是第一道关卡.它的参数验证并不是安全的,一旦被有心人抓到可乘之机,他就可以有各种方法来摸拟系统的 Http 请求,访问数据库的关键数据.轻则导致服务器宕机,重则泄露数据.所以,这时就需要设置第二道关卡,服务端验证了. 老项目的服务端校验 @RestController @RequestMapping("/student") public class ValidateOne

SpringBoot入门二十二,使用Validation进行参数校验

项目基本配置参考文章SpringBoot入门一,使用myEclipse新建一个SpringBoot项目,使用myEclipse新建一个SpringBoot项目即可,此示例springboot升级为2.2.1版本. 1. pom.xml添加aop支持 如果已经引用了spring-boot-starter-web,就不要需要引用spring-boot-starter-validation了,本例就不再引用 <!-- 引入validation支持 --> <dependency> <

API安全(五)-参数校验

1.为什么要做数据校验 要保证系统的安全性,健壮性,数据校验必不可少,校验参数的合法性,不能因为前端或者其它调用段因为参数传的不对导致我们的系统报错. 2.开发中参数校验做在哪里 一般都是做在接口层面,对传入的参数进行校验. 3.Bean Validation 对于Controller接口的参数校验,如果参数较少可以自己写代码进行校,但是如果参数较多,就会由一堆if-else,代码不美观.我们可以使用Bean Validation来进行参数校验,Bean Validation是一种Java规范,

SpringMVC控制器接收不了PUT提交的参数的解决方案

摘要: SpringMVC控制器接收不了PUT提交的参数的解决方案 这次改造了下框架,把控制器的API全部REST化,不做不知道,SpringMVC的REST有各种坑让你去跳,顺利绕过它们花了我不少时间,这次来提下SpringMVC的PUT提交参数为null的情况. 照常先贴出我的控制器代码,没什么特别的,就是打印出接受到的前台参数值: @RequestMapping(value = "/{id}", method = RequestMethod.PUT) @ResponseBody

Cocos2dx 3.x 新建项目编译很慢的解决方案

一.前言 最近在用Cocos2d-x(后面我简称"Co-x")开发项目,发现一个问题: Co-x 3.x版本在windows下,新建一个项目,使用VS2013编译时,会很慢很慢(尽管Co-x源项目已经编译过). 经过摸索,究其原因是:3.x版本中,新建项目时是直接将Co-x相关的源项目复制到所建项目的指定目录,即新建项目引用的是复制后的Co-x源项目,这样VS编译新建项目时,就会把复制的Co-x源项目重新编译一遍,时间必然很长(就算ssd还是要20来分钟,要知道以前2.x编译新建项目时

jQuery form插件的使用--用 formData 参数校验表单,验证后提交(简单验证).

Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.引入依赖js <script src="jquery-1.3.1.js" type="text/javascript"></script> <script src="jquery.form.js" type="text/javascript"&g

git使用-将本地项目添加到远程代码库

最近刚接触Git,发现挺好用的,而且OSC还提供了免费的托管仓库,打算把自己电脑上的代码同步到OSC上,结果总是出现各种失败.网上搜索的解决方案大部分是先在[email protected]上创建项目,然后再clone到本地,而我是想把已经在本地创建好的仓库直接push到[email protected]上.摸索半天终于解决,分享一下我的方式. 使用范围:已经在本地通过 git init 命令创建了本地仓库,然后想把本地仓库push到[email protected]上.不对Git的安装及使用进