I bet tons of you guys had this issue and it may be called "Javascript implicit global var" or something like that. Basically, I'm trying to write a validation tool and I have a class MIMIRxErrorHandler
. It has 2 methods, validate()
, which validates all fields, and validateSpecificField()
, which validates each field. One strange thing is that in the method validate()
, it always throws the following error:
rule is not defined for line: "let fieldName = rule.name;"
Could someone help me get through this? Thanks a lot. The whole code is below:
class MIMIRxErrorHandler {
constructor(props) {}
validate(rules) {
var errorMessages = {};
for (var i = 0; i < rules.length; i++) {
let rule = rules[i];
let fieldName = rule.name;
const validationResult = this.validateSpecificField(
rule.value,
rule.rules
);
if (validationResult.length > 0) {
errorMessages[fieldName] = `${fieldName} ${validationResult.join(",")}`;
}
}
return errorMessages;
}
validateSpecificField(value, rules) {
const isPresence = rules.presence;
const rangeRule = rules.range;
const regexRule = rules.regex;
const otherNotAllowedValuesRule = rule.otherNotAllowedValues;
var errorMessages = [];
// *** range ***
if (isPresence) {
if (value === null || value === undefined || value === NaN) {
errorMessages.push(` cannot be blank`);
}
}
if (rangeRule !== null && rangeRule !== undefined) {
const type = rangeRule.type;
if (type == "number") {
value = parseFloat(value);
if (value > rangeRule.maxLength || value < rangeRule.minLength) {
errorMessages.push(
` between ${rangeRule.minLength} and ${rangeRule.maxLength}`
);
}
} else if (type == "string") {
value = value.toString();
if (
value.length > rangeRule.maxLength ||
value.length < rangeRule.minLength
) {
errorMessages.push(
` between ${rangeRule.minLength} and ${rangeRule.maxLength}`
);
}
}
}
if (regexRule !== null && regexRule !== undefined) {
if (!value.match(regexRule.pattern)) {
errorMessages.push(regexRule.regexErrorMessage);
}
}
if (otherNotAllowedValuesRule.includes(value)) {
errorMessages.push(" is invalid");
}
return errorMessages;
}
}
rules = () => {
return [
{
name: "first_name",
value: "John",
rules: {
presence: true,
range: {
type: "string",
minLength: 10,
maxLength: 200,
},
regex: {
pattern: /^\w+$/,
regexErrorMessage: " should only be letters",
},
otherNotAllowedValues: ["0", ""],
},
},
{
name: "age",
value: "23",
rules: {
presence: true,
range: {
type: "number",
minLength: 1,
maxLength: 3,
},
regex: {
pattern: /^\d+$/,
regexErrorMessage: " should be only digits",
},
otherNotAllowedValues: ["0", ""],
},
},
];
};
var a = new MIMIRxErrorHandler();
console.log(a.validate(this.rules()));