一、错误Schema与映射type ErrorPayload = { code: string; message: string; traceId: string; hint?: string }

const statusByCode: Record<string, number> = {

'bad_request': 400,

'unauthorized': 401,

'forbidden': 403,

'not_found': 404,

'rate_limited': 429,

'server_error': 500

}

function toStatus(code: string): number { return statusByCode[code] || 500 }

二、Trace-ID与头字段type Req = { headers: Record<string, string | undefined> }

type Res = { setHeader: (k: string, v: string) => void; status: (n: number) => Res; end: (b?: string) => void }

function traceId(req: Req): string { return req.headers['x-trace-id'] || Math.random().toString(36).slice(2) }

function setCommonHeaders(res: Res, id: string) {

res.setHeader('Content-Type', 'application/json; charset=utf-8')

res.setHeader('X-Content-Type-Options', 'nosniff')

res.setHeader('X-Trace-Id', id)

}

三、错误封装与输出function makeError(code: string, message: string, traceId: string, hint?: string): ErrorPayload { return { code, message, traceId, hint } }

function sendError(req: Req, res: Res, code: string, message: string, hint?: string) {

const id = traceId(req)

setCommonHeaders(res, id)

const payload = makeError(code, message, id, hint)

res.status(toStatus(code)).end(JSON.stringify(payload))

}

四、指标与采样class Metrics {

counts = new Map<string, number>()

inc(key: string) { const n = (this.counts.get(key) || 0) + 1; this.counts.set(key, n) }

}

function sample(p: number): boolean { return Math.random() < p }

function record(metrics: Metrics, code: string, p = 0.1) { if (sample(p)) metrics.inc(code) }

五、整合中间件function guardExample(req: Req, res: Res, metrics: Metrics) {

const ok = (req.headers['authorization'] || '').startsWith('Bearer ')

if (!ok) { record(metrics, 'unauthorized'); return sendError(req, res, 'unauthorized', '缺少或无效授权', '检查令牌') }

}

六、验收清单错误码与状态码映射统一;错误Schema包含`code/message/traceId/hint`。`X-Trace-Id`传播一致;头字段包含`Content-Type`与`nosniff`;重试建议通过`hint`提供。指标采样与统计可用;日志与错误输出遵循统一格式并可脱敏。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部