ParamValidate

/**
 * 请求参数验证
 * @params  参数列表及其规则; 
 *          规则: {required: 必需的参数, 
 *                string: String类型参数, 
 *                number: number类型参数,
 *                int:    integer类型参数
 *                object: object类型
 *                array:  array类型参数}
 * @example logicValidate({page: 'required', type: ['required', 'string']})
 */
module.exports = (rulesDict) => {
    /**
     * 根据请求方式及参数名获取参数值
     * @param {koa.context} ctx koa.context
     * @param {*} name          参数名
     */
    function getRequestParam (ctx, name) {
        switch (ctx.method.toLowerCase()) {
            case 'get':
                return ctx.query[name];
            case 'post':
                return ctx.request.body[name];
        }
    }
    return async (ctx, next) => {
        let flag = false;
        let data = {};
        for (let param in rulesDict) {
            let rules = rulesDict[param];
            if (Array.isArray(rules)) {
                for (let index in rules) {
                    let rule = rules[index];
                    checkRule(rule.toLowerCase());
                }
            } else {
                checkRule(rules.toLowerCase())                
            }

            /**
             * 检查是否符合要求
             * @param {string} rule rule, lower case
             * pass: 需要局部变量,不要提取到函数外
             */
            function checkRule(rule) {
                let paramVal = getRequestParam(ctx, param);
                if (paramVal === null || typeof(paramVal) === 'undefined') {    // 如果参数值为空
                    if (rules && (rules === 'required' || rules.indexOf('required') >= 0)) {    // 如果有required规则
                        data[param] = param + ' can not be blank';
                        flag = true;
                    }
                } else if (rule === 'int') {
                    if (!Number.isInteger(paramVal)) {
                        data[param] = param + ' must be int';
                        flag = true;
                    }
                } else if (rule !== 'required' && typeof(paramVal) !== rule) {
                    data[param] = param + ' must be ' + rule;
                    flag = true;
                }
            }
        }

        if (flag) {
            ctx.body = {
                errno: 1000,
                errmsg: 'validate error',
                data
            }
        } else {
            await next();
        }
    }
}

最后更新于

这有帮助吗?