/* * @Description: 参数验证中间件 * @Autor: kindring * @Date: 2022-01-24 11:02:16 * @LastEditors: kindring * @LastEditTime: 2022-02-14 17:23:30 * @LastDescript: */ // 日志文件 const log = require('../logger').logger('paramsMid', 'info'); // 返回值列表 const rcodeMap = require('../maps/rcodeMap'); // 错误代码 const failedRcode = rcodeMap.notParam; function paramsCheck(ruleParams) { // 确定该接口需要检查什么参数 // 检查数据是否存在 return function(req, res, next) { if (!ruleParams) { return next(); } // 查询是否通过检测 let isPass; if (ruleParams.get) { isPass = checkUrlParams('get', ruleParams.get, req.query); } if (ruleParams.post) { isPass = checkUrlParams('post', ruleParams.post, req.body); } if (!isPass.pass) { log.warn(isPass.msg); res.json({ rcode: failedRcode, msg: isPass.msg }); return; } next(); } } /** * 判断参数为空 * @param {*} s 要判断的参数 */ function isEmpty(s) { if (s == undefined || s === '') { return true } return false } /** * 参数检查 * @param {*} rule * @param {*} params */ function checkUrlParams(type = 'get', rules, params) { let paramFields = Object.keys(rules); //查看规则 for (let i = 0; i < paramFields.length; i++) { let field = paramFields[i]; let rule = rules[field]; // 是否匹配类型 let isTypeEnum = false; // 1. 检查必填参数是否输入 if (rule.required && isEmpty(params[field])) { return { pass: false, msg: `${type} param ${field} required`, matchRule: rule } } // 2. 查看参数类型是否符合可选类型 if (rule.types && rule.types.length) { // 只需要满足一个 for (let i = 0; i < rule.types.length; i++) { if (typeof params[field] == rule.types[i]) { isTypeEnum = true; } } // 查看该值是否为空 if (!isTypeEnum) { return { pass: false, msg: `${type} param ${field} Type Error need ${rule.types.join('|')} but ${typeof params[field]}`, matchRule: rule } } } // 3. 查看参数是否为空,为空则自动修改为默认值 if (rule.default && params[field] === undefined) { console.log(`设置默认值字段:${field},值${rule.default}`); params[field] = rule.default; } } return { pass: true }; } module.exports = paramsCheck;