1
0

paramsCheck.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. * @Description: 参数验证中间件
  3. * @Autor: kindring
  4. * @Date: 2022-01-24 11:02:16
  5. * @LastEditors: kindring
  6. * @LastEditTime: 2022-02-14 17:23:30
  7. * @LastDescript:
  8. */
  9. // 日志文件
  10. const log = require('../logger').logger('paramsMid', 'info');
  11. // 返回值列表
  12. const rcodeMap = require('../maps/rcodeMap');
  13. // 错误代码
  14. const failedRcode = rcodeMap.notParam;
  15. function paramsCheck(ruleParams) {
  16. // 确定该接口需要检查什么参数
  17. // 检查数据是否存在
  18. return function(req, res, next) {
  19. if (!ruleParams) {
  20. return next();
  21. }
  22. // 查询是否通过检测
  23. let isPass;
  24. if (ruleParams.get) {
  25. isPass = checkUrlParams('get', ruleParams.get, req.query);
  26. }
  27. if (ruleParams.post) {
  28. isPass = checkUrlParams('post', ruleParams.post, req.body);
  29. }
  30. if (!isPass.pass) {
  31. log.warn(isPass.msg);
  32. res.json({
  33. rcode: failedRcode,
  34. msg: isPass.msg
  35. });
  36. return;
  37. }
  38. next();
  39. }
  40. }
  41. /**
  42. * 判断参数为空
  43. * @param {*} s 要判断的参数
  44. */
  45. function isEmpty(s) {
  46. if (s == undefined || s === '') {
  47. return true
  48. }
  49. return false
  50. }
  51. /**
  52. * 参数检查
  53. * @param {*} rule
  54. * @param {*} params
  55. */
  56. function checkUrlParams(type = 'get', rules, params) {
  57. let paramFields = Object.keys(rules);
  58. //查看规则
  59. for (let i = 0; i < paramFields.length; i++) {
  60. let field = paramFields[i];
  61. let rule = rules[field];
  62. // 是否匹配类型
  63. let isTypeEnum = false;
  64. // 1. 检查必填参数是否输入
  65. if (rule.required && isEmpty(params[field])) {
  66. return { pass: false, msg: `${type} param ${field} required`, matchRule: rule }
  67. }
  68. // 2. 查看参数类型是否符合可选类型
  69. if (rule.types && rule.types.length) {
  70. // 只需要满足一个
  71. for (let i = 0; i < rule.types.length; i++) {
  72. if (typeof params[field] == rule.types[i]) {
  73. isTypeEnum = true;
  74. }
  75. }
  76. // 查看该值是否为空
  77. if (!isTypeEnum) {
  78. return { pass: false, msg: `${type} param ${field} Type Error need ${rule.types.join('|')} but ${typeof params[field]}`, matchRule: rule }
  79. }
  80. }
  81. // 3. 查看参数是否为空,为空则自动修改为默认值
  82. if (rule.default && params[field] === undefined) {
  83. console.log(`设置默认值字段:${field},值${rule.default}`);
  84. params[field] = rule.default;
  85. }
  86. }
  87. return { pass: true };
  88. }
  89. module.exports = paramsCheck;