设计思路
- 通用断言函数:创建一系列通用的断言函数,用于验证不同类型的数据。例如,验证是否为数字、字符串、对象等。这些函数可以接收数据和错误信息模板作为参数,当验证失败时,根据错误信息模板抛出带有国际化支持的错误。
- 错误集中管理:定义一个错误类型枚举,将所有可能的错误类型列举出来。同时,创建一个错误信息映射表,根据不同的错误类型和语言环境,提供相应的错误信息。
- 国际化支持:引入国际化库(如
i18next
),在项目初始化时配置语言环境。断言函数在抛出错误时,根据当前语言环境从错误信息映射表中获取对应的错误信息。
- 错误处理中间件:在API请求函数外层包裹一个错误处理中间件,该中间件负责捕获断言函数抛出的错误,并进行统一处理,如记录错误日志、返回合适的HTTP状态码等。
关键代码示例
- 定义错误类型枚举
enum ErrorType {
INVALID_NUMBER = 'INVALID_NUMBER',
INVALID_STRING = 'INVALID_STRING',
INVALID_OBJECT = 'INVALID_OBJECT'
}
- 错误信息映射表
const errorMessageMap: { [key in ErrorType]: { [locale: string]: string } } = {
[ErrorType.INVALID_NUMBER]: {
en: 'The value is not a valid number',
zh: '该值不是有效的数字'
},
[ErrorType.INVALID_STRING]: {
en: 'The value is not a valid string',
zh: '该值不是有效的字符串'
},
[ErrorType.INVALID_OBJECT]: {
en: 'The value is not a valid object',
zh: '该值不是有效的对象'
}
};
- 通用断言函数
import i18next from 'i18next';
function assertNumber(value: any, errorType: ErrorType) {
if (typeof value!== 'number') {
const errorMessage = errorMessageMap[errorType][i18next.language];
throw new Error(errorMessage);
}
}
function assertString(value: any, errorType: ErrorType) {
if (typeof value!=='string') {
const errorMessage = errorMessageMap[errorType][i18next.language];
throw new Error(errorMessage);
}
}
function assertObject(value: any, errorType: ErrorType) {
if (typeof value!== 'object' || Array.isArray(value)) {
const errorMessage = errorMessageMap[errorType][i18next.language];
throw new Error(errorMessage);
}
}
- API请求函数示例
async function apiRequest() {
try {
const response = await fetch('/api/data');
const data = await response.json();
assertObject(data, ErrorType.INVALID_OBJECT);
assertNumber(data.id, ErrorType.INVALID_NUMBER);
assertString(data.name, ErrorType.INVALID_STRING);
// 处理数据
console.log('Processed data:', data);
} catch (error) {
// 错误处理中间件可在此处进行统一处理
console.error('Error:', error.message);
}
}
- 错误处理中间件示例(简单模拟)
function errorHandlingMiddleware(func: () => Promise<void>) {
return async () => {
try {
await func();
} catch (error) {
// 记录错误日志
console.error('Middleware caught error:', error.message);
// 返回合适的HTTP状态码(这里简单模拟)
// 例如,如果是无效数据错误,返回400 Bad Request
// 实际应用中可根据错误类型设置不同状态码
// res.status(400).send(error.message);
}
};
}
// 使用中间件
const apiRequestWithMiddleware = errorHandlingMiddleware(apiRequest);
apiRequestWithMiddleware();