paramsCheck.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. // 是否为必须 required
  16. // let optionsTemplate = {
  17. // body: {
  18. // owner: {
  19. // required: true,
  20. // default: 'admin'
  21. // }, //检查条件
  22. // passwd: {
  23. // required: true
  24. // },
  25. // },
  26. // get: {
  27. // }
  28. // }
  29. function paramsCheck(ruleParams) {
  30. // 确定该接口需要检查什么参数
  31. // 检查数据是否存在
  32. return function(req, res, next) {
  33. if (!ruleParams) {
  34. return next();
  35. }
  36. // 查询是否通过检测
  37. let isPass;
  38. if (ruleParams.get) {
  39. isPass = checkUrlParams('get', ruleParams.get, req.query);
  40. }
  41. if (ruleParams.post) {
  42. isPass = checkUrlParams('post', ruleParams.post, req.body);
  43. }
  44. if (!isPass.pass) {
  45. log.warn(isPass.msg);
  46. res.json({
  47. rcode: failedRcode,
  48. msg: isPass.msg
  49. });
  50. return;
  51. }
  52. next();
  53. }
  54. }
  55. /**
  56. * 判断参数为空
  57. * @param {*} s 要判断的参数
  58. */
  59. function isEmpty(s) {
  60. if (s == undefined || s === '') {
  61. return true
  62. }
  63. return false
  64. }
  65. /**
  66. * 参数检查
  67. * @param {*} rule
  68. * @param {*} params
  69. */
  70. function checkUrlParams(type = 'get', rules, params) {
  71. let paramFields = Object.keys(rules);
  72. //查看规则
  73. for (let i = 0; i < paramFields.length; i++) {
  74. let field = paramFields[i];
  75. let rule = rules[field];
  76. // 是否匹配类型
  77. let isTypeEnum = false;
  78. // 1. 检查必填参数是否输入
  79. if (rule.required && isEmpty(params[field])) {
  80. return { pass: false, msg: `${type} param ${field} required`, matchRule: rule }
  81. }
  82. // 2. 查看参数类型是否符合可选类型
  83. if (rule.types && rule.types.length) {
  84. // 只需要满足一个
  85. for (let i = 0; i < rule.types.length; i++) {
  86. if (typeof params[field] == rule.types[i]) {
  87. isTypeEnum = true;
  88. }
  89. }
  90. // 查看该值是否为空
  91. if (!isTypeEnum) {
  92. return { pass: false, msg: `${type} param ${field} Type Error need ${rule.types.join('|')} but ${typeof params[field]}`, matchRule: rule }
  93. }
  94. }
  95. // 3. 查看参数是否为空,为空则自动修改为默认值
  96. if (rule.default && params[field] === undefined) {
  97. console.log(`设置默认值字段:${field},值${rule.default}`);
  98. params[field] = rule.default;
  99. }
  100. }
  101. return { pass: true };
  102. }
  103. module.exports = paramsCheck;