support parameterized errors

This commit is contained in:
MaysWind
2020-10-25 21:48:29 +08:00
parent 35eac86454
commit 9c0af9a1bd
6 changed files with 169 additions and 5 deletions
+107
View File
@@ -1,5 +1,82 @@
import { defaultLanguage, allLanguages } from '../locales/index.js'
const validatorErrorCode = 200000;
const parameterizedErrors = [
{
localeKey: 'parameter invalid',
regex: /^parameter "(\w+)" is invalid$/,
parameters: [{
field: 'parameter',
localized: true
}]
},
{
localeKey: 'parameter required',
regex: /^parameter "(\w+)" is required$/,
parameters: [{
field: 'parameter',
localized: true
}]
},
{
localeKey: 'parameter too long',
regex: /^parameter "(\w+)" must be less than (\d+)$/,
parameters: [{
field: 'parameter',
localized: true
}, {
field: 'length',
localized: false
}]
},
{
localeKey: 'parameter too short',
regex: /^parameter "(\w+)" must be more than (\d+)$/,
parameters: [{
field: 'parameter',
localized: true
}, {
field: 'length',
localized: false
}]
},
{
localeKey: 'parameter length not equal',
regex: /^parameter "(\w+)" length is not equal to (\d+)$/,
parameters: [{
field: 'parameter',
localized: true
}, {
field: 'length',
localized: false
}]
},
{
localeKey: 'parameter cannot be blank',
regex: /^parameter "(\w+)" cannot be blank$/,
parameters: [{
field: 'parameter',
localized: true
}]
},
{
localeKey: 'parameter invalid username format',
regex: /^parameter "(\w+)" is invalid username format$/,
parameters: [{
field: 'parameter',
localized: true
}]
},
{
localeKey: 'parameter invalid email format',
regex: /^parameter "(\w+)" is invalid email format$/,
parameters: [{
field: 'parameter',
localized: true
}]
}
];
export function getAllLanguages() {
return allLanguages;
}
@@ -56,6 +133,36 @@ export function getI18nOptions() {
};
}
export function getLocalizedError(error) {
if (error.errorCode !== validatorErrorCode) {
return {
message: `error.${error.errorMessage}`
};
}
for (let i = 0; i < parameterizedErrors.length; i++) {
const errorInfo = parameterizedErrors[i];
const matches = error.errorMessage.match(errorInfo.regex);
if (matches && matches.length === errorInfo.parameters.length + 1) {
return {
message: `parameterizedError.${errorInfo.localeKey}`,
parameters: errorInfo.parameters.map((param, index) => {
return {
key: param.field,
localized: param.localized,
value: matches[index + 1]
}
})
};
}
}
return {
message: error.errorMessage
};
}
function getLocaleFromLanguageAlias(alias) {
for (let locale in allLanguages) {
if (!Object.prototype.hasOwnProperty.call(allLanguages, locale)) {