Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 

120 righe
3.9 KiB

  1. module.exports = {
  2. async init(app, meta) {
  3. const errors = {};
  4. if (meta['$_GET'] && Array.isArray(meta['$_GET'])) {
  5. await this.validateFields(app, meta['$_GET'], app.scope.data['$_GET'], errors);
  6. }
  7. if (meta['$_POST'] && Array.isArray(meta['$_POST'])) {
  8. await this.validateFields(app, meta['$_POST'], app.scope.data['$_POST'], errors);
  9. }
  10. if (Object.keys(errors).length) {
  11. app.res.status(400).json(errors);
  12. }
  13. },
  14. async validateData(app, data, noError) {
  15. const errors = {};
  16. if (Array.isArray(data)) {
  17. for (let item of data) {
  18. for (let rule in item.rules) {
  19. const options = item.rules[rule];
  20. rule = this.getRule(rule);
  21. if (!await this.validateRule(app, rule, item.value, options)) {
  22. const t = item.fieldName ? 'form' : 'data';
  23. errors[t] = errors[t] || {};
  24. errors[t][item.fieldName || item.name] = this.errorMessage(rule, options);
  25. }
  26. }
  27. }
  28. }
  29. if (Object.keys(errors).length) {
  30. if (noError) return false;
  31. app.res.status(400).json(errors);
  32. }
  33. return true;
  34. },
  35. async validateFields(app, fields, parent, errors, fieldname) {
  36. if (parent == null) return;
  37. for (let field of fields) {
  38. let value = parent[field.name];
  39. let curFieldname = fieldname ? `${fieldname}[${field.name}]` : field.name;
  40. if (field.type == 'array' && value == null) {
  41. value = [];
  42. }
  43. if (field.options && field.options.rules) {
  44. await this.validateField(app, field, value, errors, curFieldname);
  45. }
  46. if (field.type == 'object' && field.sub) {
  47. await this.validateFields(app, field.sub, value, errors, curFieldname);
  48. }
  49. if (field.type == 'array' && field.sub && field.sub[0] && field.sub[0].sub) {
  50. if (Array.isArray(value) && value.length) {
  51. for (let i = 0; i < value.length; i++) {
  52. await this.validateFields(app, field.sub[0].sub, value[i], errors, `${curFieldname}[${i}]`);
  53. }
  54. } else {
  55. await this.validateFields(app, field.sub[0].sub, null, errors, `${curFieldname}[0]`);
  56. }
  57. }
  58. }
  59. },
  60. async validateField(app, field, value, errors, fieldname) {
  61. for (let rule in field.options.rules) {
  62. const options = field.options.rules[rule];
  63. rule = this.getRule(rule);
  64. if (!await this.validateRule(app, rule, value, options)) {
  65. const t = field.fieldName ? 'form' : 'data';
  66. errors[t] = errors[t] || {};
  67. errors[t][fieldname] = this.errorMessage(rule, options);
  68. }
  69. }
  70. },
  71. async validateRule(app, rule, value, options = {}) {
  72. const module = require(`./${rule.module}`);
  73. return module[rule.method].call(app, value, options.param);
  74. },
  75. errorMessage(rule, options = {}) {
  76. let message = options.message;
  77. if (!message) {
  78. const { validator: messages } = require('../locale/en-US');
  79. message = messages[rule.module][rule.method];
  80. }
  81. if (typeof options.param != 'object') {
  82. options.param = { '0': options.param };
  83. }
  84. return message.replace(/{([^}]+)}/g, (m, i) => options.param[i]);
  85. },
  86. getRule(rule) {
  87. const colon = rule.indexOf(':');
  88. return {
  89. module: colon > 0 ? rule.substr(0, colon) : 'core',
  90. method: colon > 0 ? rule.substr(colon + 1) : rule
  91. };
  92. }
  93. };