result - 结果处理
控制器返回结果统一处理,默认返回格式为 JSON
依赖模块
- @zenweb/messagecode
配置项
| 配置项 | 类型 | 默认值 | 功能 |
|---|---|---|---|
| failCode | number | 无 | 默认失败代码 |
| failStatus | number | 422 | 默认失败HTTP状态码 |
| successWrap | (ctx: Context, data?: unknown): unknown | return { data } | 成功结果包装 |
| failWrap | (ctx: Context, err: ResultFail): unknown | return { err.code, err.data, err.message } | 错误结果包装 |
| exposeUnexpected | boolean | false | 暴露意外错误信息。可以设置环境变量 EXPOSE_UNEXPECTED==1 开启 |
| unexpectedStatus | number | 500 | 意外错误HTTP状态码 |
| allowResultPick | boolean | true | 是否允许通过请求头 x-result-pick 裁剪返回字段,详见 x-result-pick 字段筛选 |
Core 挂载项
无
Context 挂载项
| 挂载项 | 类型 | 功能 |
|---|---|---|
| success | (data?: unknown): Promise | 成功,输出结果。(注意:代码会继续执行),如果需要等待结果包装需要 await |
全局方法
| 方法 | 类型 | 功能 |
|---|---|---|
| fail | (message: string): never | 失败,输出错误信息并终止代码执行 |
| fail | (code: number, message?: string, data?: unknown): never | 失败,带错误代码输出 |
| fail | (detail: ResultFailDetail): never | 失败,输出错误信息并终止代码执行(更多选项) |
可注入对象
- singleton
- RenderManager
演示
import { Get, fail } from 'zenweb';
export class ResultController {
@Get()
hello() {
return 'Hello';
}
@Get()
error() {
fail('error info'); // 在调用 fail 方法后会直接跳出方法并输出
console.log('这行不会执行');
}
}
fail 配置
配置 message-codes.json
{
"400": "这是一个错误代码描述",
"user.username.short: "您的用户名太短:{username}"
}
失败输出
fail(400); // 使用错误代码数值,绝对匹配
fail('user.username.short', { username: 'AAA' }); // 使用错误代码字符串,递归匹配
// 完全自定义
fail({
code: 123,
message: "自定义",
status: 200,
});
failCodeHeader 配置说明
当请求结果为失败时,failCodeHeader 选项可以将错误代码写入 HTTP 响应头中,方便前端或网关层直接从头信息读取错误代码而不需要解析响应体。
| 值 | 行为 |
|---|---|
true(默认) | 启用,使用默认头字段名 X-Fail-Code |
false | 关闭,不输出错误代码到头信息 |
string | 启用,使用自定义头字段名,例如 'X-Error-Code' |
import { create } from 'zenweb';
create({
result: {
// 默认行为:错误代码输出到 X-Fail-Code 头字段
failCodeHeader: true,
// 自定义头字段名
failCodeHeader: 'X-Error-Code',
// 关闭头字段输出
failCodeHeader: false,
},
});
当发生失败时,响应头示例:
HTTP/1.1 422 Unprocessable Entity
X-Fail-Code: 400
Content-Type: application/json
x-result-pick 字段筛选
通过请求头 x-result-pick,客户端可以按需指定要返回的字段,服务端在输出前自动裁剪数据。适用于列表页、详情页等只需要部分字段的场景,有效减少网络流量和前端处理开销。