修掉审查查出的五个问题
保存失败会丢掉整张表单:对话框在 await commit 之前就关了,重开是空的。改成只有成功才关。
错误响应原本有两种形状({error} 和 {message,hint}),前端只读 message,于是服务端
写好的中文提示一律退化成「请求失败(HTTP 4xx)」。统一成 { message, hint? }。
路由处理器没有兜底:请求体不是合法 JSON、配置文件运行中被删,都会返回一个没有响应体
的 500。这条链路的立意是出事时把用户救回来,而出事时给的偏偏是最没信息量的一句话。
延迟测试失败被写进 done,而 done 的样式是成功绿。拆出中性的 notice——测不通是关于
线路的结论,既不是操作失败也不是成功。
刷新原本只有一个动词,测一条线路的延迟会导致整份配置被重读、重新解析、跑一遍引用校验,
外加四个往返。拆成 saved 和 runtime-changed 两个事件,运行时动作只重读运行时状态。
This commit is contained in:
+16
-2
@@ -23,16 +23,30 @@ export function clearToken(): void {
|
||||
localStorage.removeItem(TOKEN_KEY)
|
||||
}
|
||||
|
||||
/** 接口报错时抛这个,界面据此决定是提示重填令牌还是显示错误内容。 */
|
||||
/**
|
||||
* 接口报错时抛这个。
|
||||
*
|
||||
* 服务端的错误响应统一是 { message, hint? }:message 说发生了什么,hint 说下一步该干嘛。
|
||||
* 界面直接用这两个字段,不需要认得每个端点各自的错误形状。
|
||||
*/
|
||||
export class ApiError extends Error {
|
||||
constructor(
|
||||
readonly status: number,
|
||||
readonly payload: Record<string, unknown>,
|
||||
) {
|
||||
super(typeof payload.message === 'string' ? payload.message : `请求失败(HTTP ${String(status)})`)
|
||||
super(
|
||||
typeof payload.message === 'string'
|
||||
? payload.message
|
||||
: `请求失败(HTTP ${String(status)})`,
|
||||
)
|
||||
this.name = 'ApiError'
|
||||
}
|
||||
|
||||
/** 服务端给的下一步建议,没有就是空串。 */
|
||||
get hint(): string {
|
||||
return typeof this.payload.hint === 'string' ? this.payload.hint : ''
|
||||
}
|
||||
|
||||
get unauthorized(): boolean {
|
||||
return this.status === 401
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user