schema-dsl 1.1.7 → 1.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -15
- package/README.md +46 -1
- package/changelogs/v1.1.8.md +376 -0
- package/docs/error-handling.md +101 -9
- package/docs/runtime-locale-support.md +57 -6
- package/examples/i18n-error-handling-complete.js +381 -0
- package/examples/i18n-error-handling-quickstart.md +0 -0
- package/index.d.ts +106 -33
- package/index.js +34 -9
- package/lib/errors/I18nError.js +77 -15
- package/package.json +1 -1
- package/changelogs/v1.1.7.md +0 -317
package/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# 变更日志 (CHANGELOG)
|
|
2
2
|
|
|
3
3
|
> **说明**: 版本概览摘要,详细变更见 [changelogs/](./changelogs/) 目录
|
|
4
|
-
> **最后更新**: 2026-01-
|
|
4
|
+
> **最后更新**: 2026-01-30
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
| 版本 | 日期 | 变更摘要 | 详细 |
|
|
11
11
|
|------|------|---------|------|
|
|
12
|
+
| [v1.1.8](./changelogs/v1.1.8.md) | 2026-01-30 | 🚀 新功能:智能参数识别 - 支持简化语法 `dsl.error.throw('key', 'locale')` | [查看](./changelogs/v1.1.8.md) |
|
|
12
13
|
| [v1.1.7](./changelogs/v1.1.7.md) | 2026-01-27 | 🐛 Bug修复:错误消息路径显示优化 - 所有错误类型的 message 只显示字段名 | [查看](./changelogs/v1.1.7.md) |
|
|
13
14
|
| [v1.1.6](./changelogs/v1.1.6.md) | 2026-01-23 | 🐛 Bug修复:enum和additionalProperties错误消息模板变量未替换 | [查看](./changelogs/v1.1.6.md) |
|
|
14
15
|
| [v1.1.5](./changelogs/v1.1.5.md) | 2026-01-17 | 🚀 新功能:错误配置对象格式支持 - 语言包支持 `{ code, message }` 对象格式 | [查看](./changelogs/v1.1.5.md) |
|
|
@@ -29,7 +30,7 @@
|
|
|
29
30
|
| [v1.0.0](./changelogs/v1.0.0.md) | 2025-12-29 | 初始发布版本 | [查看](./changelogs/v1.0.0.md) |
|
|
30
31
|
|
|
31
32
|
> 💡 **提示**: 重要版本的详细变更记录在 [changelogs/](./changelogs/) 目录中。
|
|
32
|
-
> 当前已有详细文档的版本:v1.1.7, v1.1.6, v1.1.5, v1.1.4, v1.1.3, v1.1.2, v1.1.1, v1.1.0, v1.0.9, v1.0.0
|
|
33
|
+
> 当前已有详细文档的版本:v1.1.8, v1.1.7, v1.1.6, v1.1.5, v1.1.4, v1.1.3, v1.1.2, v1.1.1, v1.1.0, v1.0.9, v1.0.0
|
|
33
34
|
> 其他版本的详细变更信息请参考项目提交历史或联系维护者。
|
|
34
35
|
|
|
35
36
|
---
|
|
@@ -38,30 +39,45 @@
|
|
|
38
39
|
|
|
39
40
|
| 版本系列 | 版本数 | 主要改进方向 |
|
|
40
41
|
|---------|-------|------------|
|
|
41
|
-
| v1.1.x |
|
|
42
|
+
| v1.1.x | 9 | 智能参数识别、Bug修复、错误消息优化、错误配置增强、TypeScript类型完善、多语言支持、数字运算符、联合类型 |
|
|
42
43
|
| v1.0.x | 10 | 核心功能、验证器、测试覆盖、文档完善 |
|
|
43
44
|
|
|
44
45
|
---
|
|
45
46
|
|
|
46
47
|
## 里程碑版本
|
|
47
48
|
|
|
48
|
-
### v1.1.
|
|
49
|
+
### v1.1.8 - 智能参数识别 🚀
|
|
49
50
|
|
|
50
|
-
**发布日期**: 2026-01-
|
|
51
|
-
**重要性**:
|
|
51
|
+
**发布日期**: 2026-01-30
|
|
52
|
+
**重要性**: ⭐⭐⭐⭐⭐
|
|
52
53
|
|
|
53
54
|
**主要改进**:
|
|
54
|
-
-
|
|
55
|
-
- ✅
|
|
56
|
-
- ✅
|
|
57
|
-
- ✅
|
|
58
|
-
- ✅
|
|
55
|
+
- 🚀 新增智能参数识别功能,支持简化语法 `dsl.error.throw('key', 'locale')`
|
|
56
|
+
- ✅ 从4个参数减少到2个参数(不需要参数对象时)
|
|
57
|
+
- ✅ 智能识别第2个参数类型:字符串→语言参数,对象→参数对象
|
|
58
|
+
- ✅ 所有方法都支持:create、throw、assert
|
|
59
|
+
- ✅ 完全向后兼容,现有代码无需修改
|
|
60
|
+
- ✅ 新增 17 个测试用例,100%通过率
|
|
59
61
|
|
|
60
62
|
**技术细节**:
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
63
|
+
- 新增 `normalizeParams()` 工具函数
|
|
64
|
+
- 修改文件:`lib/errors/I18nError.js`、`index.js`
|
|
65
|
+
- 参数识别逻辑:typeof 检查 + Array.isArray 排除
|
|
66
|
+
- 零性能损失,运行时开销可忽略不计
|
|
67
|
+
|
|
68
|
+
**使用示例**:
|
|
69
|
+
```javascript
|
|
70
|
+
// 之前:必须传递空对象
|
|
71
|
+
dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
|
|
72
|
+
|
|
73
|
+
// 现在:直接传语言参数
|
|
74
|
+
dsl.error.throw('account.notFound', 'zh-CN', 404);
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### v1.1.7 - 错误消息路径显示优化 🐛
|
|
78
|
+
|
|
79
|
+
**发布日期**: 2026-01-27
|
|
80
|
+
**重要性**: ⭐⭐⭐⭐
|
|
65
81
|
|
|
66
82
|
### v1.1.6 - ErrorFormatter Bug修复 🐛
|
|
67
83
|
|
package/README.md
CHANGED
|
@@ -68,7 +68,52 @@ console.log(result.valid); // true
|
|
|
68
68
|
|
|
69
69
|
---
|
|
70
70
|
|
|
71
|
-
## 🆕 最新特性(v1.1.
|
|
71
|
+
## 🆕 最新特性(v1.1.8)
|
|
72
|
+
|
|
73
|
+
### 🎯 智能参数识别 - 简化语法支持(v1.1.8)
|
|
74
|
+
|
|
75
|
+
**API 更简洁,从4个参数减少到2个参数**
|
|
76
|
+
|
|
77
|
+
```javascript
|
|
78
|
+
const { dsl, Locale } = require('schema-dsl');
|
|
79
|
+
|
|
80
|
+
// 配置语言包
|
|
81
|
+
Locale.addLocale('zh-CN', {
|
|
82
|
+
'account.notFound': {
|
|
83
|
+
code: 40001,
|
|
84
|
+
message: '账户不存在'
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
Locale.addLocale('en-US', {
|
|
89
|
+
'account.notFound': {
|
|
90
|
+
code: 40001,
|
|
91
|
+
message: 'Account not found'
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// ✅ 新增:简化语法(推荐)
|
|
96
|
+
dsl.error.throw('account.notFound', 'zh-CN');
|
|
97
|
+
dsl.error.throw('account.notFound', 'zh-CN', 404);
|
|
98
|
+
|
|
99
|
+
// ✅ 标准语法(完全兼容)
|
|
100
|
+
dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
|
|
101
|
+
dsl.error.throw('account.notFound', { id: '123' }, 404, 'zh-CN');
|
|
102
|
+
|
|
103
|
+
// 所有方法都支持
|
|
104
|
+
dsl.error.create('account.notFound', 'zh-CN');
|
|
105
|
+
dsl.error.assert(account, 'account.notFound', 'zh-CN');
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**核心优势**:
|
|
109
|
+
- 🎯 **参数更少**: 无需参数对象时从4个参数减少到2个
|
|
110
|
+
- 🎯 **智能识别**: 自动判断第2个参数是语言还是参数对象
|
|
111
|
+
- 🎯 **完全兼容**: 现有代码无需修改,渐进式增强
|
|
112
|
+
- 🎯 **降低错误**: 不再需要传递空对象 `{}`
|
|
113
|
+
|
|
114
|
+
📖 [完整文档](./docs/error-handling.md) · [实现原理](./docs/i18n-implementation-analysis.md) · [变更日志](./changelogs/v1.1.8.md)
|
|
115
|
+
|
|
116
|
+
---
|
|
72
117
|
|
|
73
118
|
### 🎯 错误配置对象格式支持(v1.1.5)
|
|
74
119
|
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
# schema-dsl v1.1.8 变更日志
|
|
2
|
+
|
|
3
|
+
> **发布日期**: 2026-01-30
|
|
4
|
+
> **类型**: 功能增强 🚀
|
|
5
|
+
> **重要性**: ⭐⭐⭐⭐⭐
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 📋 本版本概览
|
|
10
|
+
|
|
11
|
+
### 🎯 核心更新
|
|
12
|
+
|
|
13
|
+
**智能参数识别 - 简化语法支持**
|
|
14
|
+
|
|
15
|
+
支持简化的错误抛出语法,从4个参数减少到2个参数,使API调用更加简洁直观。
|
|
16
|
+
|
|
17
|
+
```javascript
|
|
18
|
+
// ✅ 新增:简化语法
|
|
19
|
+
dsl.error.throw('account.notFound', 'zh-CN');
|
|
20
|
+
|
|
21
|
+
// ✅ 保持:标准语法(完全兼容)
|
|
22
|
+
dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 🚀 新增功能
|
|
28
|
+
|
|
29
|
+
### 1. 智能参数识别
|
|
30
|
+
|
|
31
|
+
**问题背景**:原有API需要4个参数,即使不需要参数对象也要传空对象 `{}`
|
|
32
|
+
|
|
33
|
+
```javascript
|
|
34
|
+
// ❌ 原有方式:必须传递空对象
|
|
35
|
+
dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**解决方案**:智能识别第2个参数类型,自动判断是语言参数还是参数对象
|
|
39
|
+
|
|
40
|
+
```javascript
|
|
41
|
+
// ✅ 简化语法:直接传语言
|
|
42
|
+
dsl.error.throw('account.notFound', 'zh-CN');
|
|
43
|
+
dsl.error.throw('account.notFound', 'zh-CN', 404);
|
|
44
|
+
|
|
45
|
+
// ✅ 标准语法:传参数对象(完全兼容)
|
|
46
|
+
dsl.error.throw('account.notFound', { id: '123' }, 404, 'zh-CN');
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**识别规则**:
|
|
50
|
+
- 第2个参数是 `string` → 识别为语言参数
|
|
51
|
+
- 第2个参数是 `object` → 识别为参数对象
|
|
52
|
+
- 第2个参数是 `null/undefined/数组` → 使用默认值
|
|
53
|
+
|
|
54
|
+
### 2. 所有错误方法都支持
|
|
55
|
+
|
|
56
|
+
```javascript
|
|
57
|
+
// dsl.error.create() - 创建错误
|
|
58
|
+
const error = dsl.error.create('account.notFound', 'zh-CN');
|
|
59
|
+
|
|
60
|
+
// dsl.error.throw() - 抛出错误
|
|
61
|
+
dsl.error.throw('account.notFound', 'zh-CN');
|
|
62
|
+
|
|
63
|
+
// dsl.error.assert() - 断言式错误
|
|
64
|
+
dsl.error.assert(account, 'account.notFound', 'zh-CN');
|
|
65
|
+
dsl.error.assert(account, 'account.notFound', 'zh-CN', 404);
|
|
66
|
+
|
|
67
|
+
// I18nError 直接调用
|
|
68
|
+
I18nError.throw('account.notFound', 'zh-CN');
|
|
69
|
+
I18nError.create('account.notFound', 'zh-CN');
|
|
70
|
+
I18nError.assert(account, 'account.notFound', 'zh-CN');
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 🔧 技术实现
|
|
76
|
+
|
|
77
|
+
### 新增工具函数
|
|
78
|
+
|
|
79
|
+
```javascript
|
|
80
|
+
/**
|
|
81
|
+
* 智能参数识别工具函数
|
|
82
|
+
* @private
|
|
83
|
+
*/
|
|
84
|
+
function normalizeParams(paramsOrLocale, statusCode, locale) {
|
|
85
|
+
let params = {};
|
|
86
|
+
let actualStatusCode = 400;
|
|
87
|
+
let actualLocale = null;
|
|
88
|
+
|
|
89
|
+
if (typeof paramsOrLocale === 'string') {
|
|
90
|
+
// 字符串 → 语言参数
|
|
91
|
+
actualLocale = paramsOrLocale;
|
|
92
|
+
actualStatusCode = typeof statusCode === 'number' ? statusCode : 400;
|
|
93
|
+
} else if (paramsOrLocale && typeof paramsOrLocale === 'object' && !Array.isArray(paramsOrLocale)) {
|
|
94
|
+
// 对象(非数组)→ 参数对象
|
|
95
|
+
params = paramsOrLocale;
|
|
96
|
+
actualStatusCode = typeof statusCode === 'number' ? statusCode : 400;
|
|
97
|
+
actualLocale = locale;
|
|
98
|
+
} else {
|
|
99
|
+
// null/undefined/数组 → 使用默认值
|
|
100
|
+
actualStatusCode = typeof statusCode === 'number' ? statusCode : 400;
|
|
101
|
+
actualLocale = locale;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return { params, statusCode: actualStatusCode, locale: actualLocale };
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 修改的方法
|
|
109
|
+
|
|
110
|
+
- `I18nError.create()`
|
|
111
|
+
- `I18nError.throw()`
|
|
112
|
+
- `I18nError.assert()`
|
|
113
|
+
- `dsl.error.create()`
|
|
114
|
+
- `dsl.error.throw()`
|
|
115
|
+
- `dsl.error.assert()`
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## 📖 使用示例
|
|
120
|
+
|
|
121
|
+
### Express API 示例
|
|
122
|
+
|
|
123
|
+
```javascript
|
|
124
|
+
const { dsl, Locale } = require('schema-dsl');
|
|
125
|
+
|
|
126
|
+
// 配置语言包
|
|
127
|
+
Locale.addLocale('zh-CN', {
|
|
128
|
+
'account.notFound': {
|
|
129
|
+
code: 40001,
|
|
130
|
+
message: '账户不存在'
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
Locale.addLocale('en-US', {
|
|
135
|
+
'account.notFound': {
|
|
136
|
+
code: 40001,
|
|
137
|
+
message: 'Account not found'
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// API 路由
|
|
142
|
+
app.get('/api/account/:id', async (req, res) => {
|
|
143
|
+
try {
|
|
144
|
+
const account = await findAccount(req.params.id);
|
|
145
|
+
const locale = req.headers['accept-language'] || 'zh-CN';
|
|
146
|
+
|
|
147
|
+
// 🎯 简化语法:只需2个参数
|
|
148
|
+
dsl.error.assert(account, 'account.notFound', locale);
|
|
149
|
+
|
|
150
|
+
res.json(account);
|
|
151
|
+
} catch (error) {
|
|
152
|
+
res.status(error.statusCode).json(error.toJSON());
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 对比示例
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
160
|
+
// 之前:4个参数
|
|
161
|
+
dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
|
|
162
|
+
dsl.error.assert(account, 'account.notFound', {}, 404, 'zh-CN');
|
|
163
|
+
|
|
164
|
+
// 现在:2个参数(无需参数对象时)
|
|
165
|
+
dsl.error.throw('account.notFound', 'zh-CN', 404);
|
|
166
|
+
dsl.error.assert(account, 'account.notFound', 'zh-CN', 404);
|
|
167
|
+
|
|
168
|
+
// 或者:3个参数(带参数对象)
|
|
169
|
+
dsl.error.throw('account.insufficientBalance',
|
|
170
|
+
{ balance: 50, required: 100 },
|
|
171
|
+
'zh-CN'
|
|
172
|
+
);
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## ✅ 向后兼容性
|
|
178
|
+
|
|
179
|
+
### 完全向后兼容
|
|
180
|
+
|
|
181
|
+
所有原有调用方式都完全正常工作,无需修改任何现有代码。
|
|
182
|
+
|
|
183
|
+
| 原有调用方式 | 兼容性 | 说明 |
|
|
184
|
+
|-------------|--------|------|
|
|
185
|
+
| `throw('key')` | ✅ 完全兼容 | 使用全局语言 |
|
|
186
|
+
| `throw('key', {})` | ✅ 完全兼容 | 空参数对象 |
|
|
187
|
+
| `throw('key', {}, 404)` | ✅ 完全兼容 | 带状态码 |
|
|
188
|
+
| `throw('key', {}, 404, 'zh')` | ✅ 完全兼容 | 完整4参数 |
|
|
189
|
+
| `throw('key', {params}, 404, 'zh')` | ✅ 完全兼容 | 带参数对象 |
|
|
190
|
+
| `throw('key', null, 404, 'zh')` | ✅ 完全兼容 | null 参数 |
|
|
191
|
+
|
|
192
|
+
### 测试验证
|
|
193
|
+
|
|
194
|
+
- **17个测试用例**,全部通过
|
|
195
|
+
- **零破坏性变更**
|
|
196
|
+
- **100%向后兼容**
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## 🎨 优势
|
|
201
|
+
|
|
202
|
+
### 1. 用户体验提升
|
|
203
|
+
|
|
204
|
+
- **参数减少**:从4个参数减少到2个(不需要参数对象时)
|
|
205
|
+
- **语法简洁**:`throw('key', 'locale')` 更直观
|
|
206
|
+
- **易于理解**:参数含义更清晰
|
|
207
|
+
|
|
208
|
+
### 2. 减少错误
|
|
209
|
+
|
|
210
|
+
- **避免混淆**:不再需要传递空对象 `{}`
|
|
211
|
+
- **类型安全**:智能识别参数类型
|
|
212
|
+
- **降低学习成本**:新手更容易上手
|
|
213
|
+
|
|
214
|
+
### 3. 保持兼容
|
|
215
|
+
|
|
216
|
+
- **渐进式增强**:新旧语法并存
|
|
217
|
+
- **零风险升级**:现有代码无需修改
|
|
218
|
+
- **平滑过渡**:可以逐步迁移到简化语法
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 📊 性能影响
|
|
223
|
+
|
|
224
|
+
**无性能损失**
|
|
225
|
+
|
|
226
|
+
- 参数识别逻辑简单(类型检查)
|
|
227
|
+
- 运行时开销可忽略不计
|
|
228
|
+
- 不影响错误抛出性能
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## 📦 修改文件清单
|
|
233
|
+
|
|
234
|
+
### 核心文件
|
|
235
|
+
|
|
236
|
+
1. **lib/errors/I18nError.js**
|
|
237
|
+
- 新增 `normalizeParams()` 工具函数
|
|
238
|
+
- 修改 `create()` 方法
|
|
239
|
+
- 修改 `throw()` 方法
|
|
240
|
+
- 修改 `assert()` 方法
|
|
241
|
+
|
|
242
|
+
2. **index.js**
|
|
243
|
+
- 更新 `dsl.error` 的 JSDoc 文档
|
|
244
|
+
|
|
245
|
+
### 文档文件
|
|
246
|
+
|
|
247
|
+
3. **README.md**
|
|
248
|
+
- 添加简化语法示例
|
|
249
|
+
|
|
250
|
+
4. **CHANGELOG.md**
|
|
251
|
+
- 添加 v1.1.8 版本信息
|
|
252
|
+
|
|
253
|
+
5. **changelogs/v1.1.8.md**
|
|
254
|
+
- 详细变更文档(本文件)
|
|
255
|
+
|
|
256
|
+
6. **docs/error-handling.md**
|
|
257
|
+
- 更新错误处理指南
|
|
258
|
+
|
|
259
|
+
7. **docs/runtime-locale-support.md**
|
|
260
|
+
- 更新运行时语言文档
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## 🔗 相关文档
|
|
265
|
+
|
|
266
|
+
- [错误处理完整指南](../docs/error-handling.md)
|
|
267
|
+
- [运行时多语言支持](../docs/runtime-locale-support.md)
|
|
268
|
+
- [API 参考文档](../docs/api-reference.md)
|
|
269
|
+
- [实现原理分析](../docs/i18n-implementation-analysis.md)
|
|
270
|
+
- [兼容性分析](../docs/api-compatibility-analysis.md)
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## 📝 升级指南
|
|
275
|
+
|
|
276
|
+
### 如何升级
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
npm install schema-dsl@1.1.8
|
|
280
|
+
# 或
|
|
281
|
+
yarn add schema-dsl@1.1.8
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### 是否需要修改代码?
|
|
285
|
+
|
|
286
|
+
**不需要!** 本版本完全向后兼容,现有代码无需任何修改。
|
|
287
|
+
|
|
288
|
+
### 推荐的迁移方式
|
|
289
|
+
|
|
290
|
+
可以逐步将代码迁移到简化语法:
|
|
291
|
+
|
|
292
|
+
```javascript
|
|
293
|
+
// 旧代码(继续有效)
|
|
294
|
+
dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
|
|
295
|
+
|
|
296
|
+
// 新代码(推荐)
|
|
297
|
+
dsl.error.throw('account.notFound', 'zh-CN', 404);
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## 🧪 测试覆盖
|
|
303
|
+
|
|
304
|
+
### 测试用例
|
|
305
|
+
|
|
306
|
+
创建了完整的测试套件 `test-smart-params.js`,包含17个测试用例:
|
|
307
|
+
|
|
308
|
+
1. ✅ 简化语法 - 中文
|
|
309
|
+
2. ✅ 简化语法 - 英文 + 404
|
|
310
|
+
3. ✅ 标准语法 - 4参数
|
|
311
|
+
4. ✅ 标准语法 - 带参数对象
|
|
312
|
+
5. ✅ 省略所有参数 - 使用全局语言
|
|
313
|
+
6. ✅ create() 方法 - 简化语法
|
|
314
|
+
7. ✅ create() 方法 - 带状态码
|
|
315
|
+
8. ✅ assert() 方法 - 简化语法
|
|
316
|
+
9. ✅ assert() 方法 - 不应该抛错
|
|
317
|
+
10. ✅ assert() 方法 - 带状态码
|
|
318
|
+
11. ✅ assert() 方法 - 带参数对象
|
|
319
|
+
12. ✅ 边缘情况 - null 参数
|
|
320
|
+
13. ✅ 边缘情况 - undefined 参数
|
|
321
|
+
14. ✅ 边缘情况 - 数组参数
|
|
322
|
+
15. ✅ I18nError.throw() 直接调用
|
|
323
|
+
16. ✅ I18nError.create() 直接调用
|
|
324
|
+
17. ✅ I18nError.assert() 直接调用
|
|
325
|
+
|
|
326
|
+
### 测试结果
|
|
327
|
+
|
|
328
|
+
```
|
|
329
|
+
📊 测试结果总结:
|
|
330
|
+
✅ 通过: 17 个测试
|
|
331
|
+
❌ 失败: 0 个测试
|
|
332
|
+
📈 通过率: 100.0%
|
|
333
|
+
|
|
334
|
+
🎉 所有测试都通过了!智能参数识别功能完全正常!
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## 🐛 已知问题
|
|
340
|
+
|
|
341
|
+
无已知问题。
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## 🎯 下一步计划
|
|
346
|
+
|
|
347
|
+
- 更新所有文档示例
|
|
348
|
+
- 添加更多使用场景
|
|
349
|
+
- 完善 TypeScript 类型定义
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## 👥 贡献者
|
|
354
|
+
|
|
355
|
+
感谢以下贡献者对本版本的贡献:
|
|
356
|
+
|
|
357
|
+
- AI Assistant - 功能设计与实现
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## 📢 致谢
|
|
362
|
+
|
|
363
|
+
感谢社区用户的反馈和建议,帮助我们不断改进 API 设计!
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
**发布日期**: 2026-01-30
|
|
368
|
+
**版本**: v1.1.8
|
|
369
|
+
**上一版本**: v1.1.7 (错误消息路径显示优化)
|
|
370
|
+
**下一版本预告**: 计划改进文档和示例代码
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
**完整变更日志**: [CHANGELOG.md](../CHANGELOG.md)
|
|
375
|
+
**GitHub**: [https://github.com/vextjs/schema-dsl](https://github.com/vextjs/schema-dsl)
|
|
376
|
+
**npm**: [https://www.npmjs.com/package/schema-dsl](https://www.npmjs.com/package/schema-dsl)
|
package/docs/error-handling.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# schema-dsl 错误处理完整指南
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
>
|
|
3
|
+
> **更新**: 2026-01-30
|
|
4
|
+
> **版本**: v1.1.8+
|
|
5
5
|
> **适用**: 企业级应用开发
|
|
6
6
|
|
|
7
7
|
---
|
|
@@ -9,13 +9,105 @@
|
|
|
9
9
|
## 📋 目录
|
|
10
10
|
|
|
11
11
|
1. [错误对象结构](#错误对象结构)
|
|
12
|
-
2. [
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
2. [I18nError - 多语言错误抛出](#i18nerror---多语言错误抛出) 🆕
|
|
13
|
+
- [智能参数识别(v1.1.8)](#智能参数识别v118)
|
|
14
|
+
- [简化语法](#简化语法)
|
|
15
|
+
- [所有调用方式](#所有调用方式)
|
|
16
|
+
3. [错误消息定制](#错误消息定制)
|
|
17
|
+
4. [错误码系统](#错误码系统)
|
|
18
|
+
5. [多层级错误处理](#多层级错误处理)
|
|
19
|
+
6. [API响应设计](#api响应设计)
|
|
20
|
+
7. [前端错误展示](#前端错误展示)
|
|
21
|
+
8. [错误日志记录](#错误日志记录)
|
|
22
|
+
9. [最佳实践](#最佳实践)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## I18nError - 多语言错误抛出
|
|
27
|
+
|
|
28
|
+
### 智能参数识别(v1.1.8)
|
|
29
|
+
|
|
30
|
+
**v1.1.8 新增**:支持简化语法,智能识别第2个参数类型
|
|
31
|
+
|
|
32
|
+
#### 简化语法
|
|
33
|
+
|
|
34
|
+
```javascript
|
|
35
|
+
const { dsl, Locale } = require('schema-dsl');
|
|
36
|
+
|
|
37
|
+
// 配置语言包
|
|
38
|
+
Locale.addLocale('zh-CN', {
|
|
39
|
+
'account.notFound': {
|
|
40
|
+
code: 40001,
|
|
41
|
+
message: '账户不存在'
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
Locale.addLocale('en-US', {
|
|
46
|
+
'account.notFound': {
|
|
47
|
+
code: 40001,
|
|
48
|
+
message: 'Account not found'
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// ✅ 新增:简化语法(推荐)
|
|
53
|
+
dsl.error.throw('account.notFound', 'zh-CN');
|
|
54
|
+
dsl.error.throw('account.notFound', 'zh-CN', 404);
|
|
55
|
+
|
|
56
|
+
// ✅ 标准语法(完全兼容)
|
|
57
|
+
dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
|
|
58
|
+
dsl.error.throw('account.notFound', { id: '123' }, 404, 'zh-CN');
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
#### 智能识别规则
|
|
62
|
+
|
|
63
|
+
```javascript
|
|
64
|
+
// 规则:自动判断第2个参数类型
|
|
65
|
+
typeof params === 'string' → 识别为语言参数
|
|
66
|
+
typeof params === 'object' → 识别为参数对象
|
|
67
|
+
params === null/undefined → 使用默认值
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
#### 所有调用方式
|
|
71
|
+
|
|
72
|
+
```javascript
|
|
73
|
+
// 1. 简化语法 - 只传语言
|
|
74
|
+
dsl.error.throw('account.notFound', 'zh-CN');
|
|
75
|
+
dsl.error.create('account.notFound', 'en-US');
|
|
76
|
+
dsl.error.assert(account, 'account.notFound', 'zh-CN');
|
|
77
|
+
|
|
78
|
+
// 2. 简化语法 - 语言 + 状态码
|
|
79
|
+
dsl.error.throw('account.notFound', 'zh-CN', 404);
|
|
80
|
+
dsl.error.assert(account, 'account.notFound', 'zh-CN', 404);
|
|
81
|
+
|
|
82
|
+
// 3. 标准语法 - 带参数对象
|
|
83
|
+
dsl.error.throw('account.insufficientBalance',
|
|
84
|
+
{ balance: 50, required: 100 },
|
|
85
|
+
400,
|
|
86
|
+
'zh-CN'
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
// 4. 省略所有参数 - 使用全局语言
|
|
90
|
+
dsl.error.throw('account.notFound');
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
#### 实际应用
|
|
94
|
+
|
|
95
|
+
```javascript
|
|
96
|
+
// Express API
|
|
97
|
+
app.get('/api/account/:id', async (req, res) => {
|
|
98
|
+
try {
|
|
99
|
+
const account = await findAccount(req.params.id);
|
|
100
|
+
const locale = req.headers['accept-language'] || 'zh-CN';
|
|
101
|
+
|
|
102
|
+
// 🎯 简化语法:只需2个参数
|
|
103
|
+
dsl.error.assert(account, 'account.notFound', locale);
|
|
104
|
+
|
|
105
|
+
res.json(account);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
res.status(error.statusCode).json(error.toJSON());
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
```
|
|
19
111
|
|
|
20
112
|
---
|
|
21
113
|
|