'use strict'; // 标准中间件:错误边界。 // 路由处理器只需 throw,由这里统一映射为响应: // · err.status 优先(处理器可对上游错误标注 502 等) // · 智能问数的参数类错误码 → 400 // · 其余 → 500 // 响应体形状与拆分前一致:{ error: message, code?: errCode } const { sendJson } = require('./util.js'); const ASK_CLIENT_CODES = new Set(['ASK_NO_MODEL', 'ASK_EMPTY', 'ASK_NO_ENTITY']); function errorStatus(e) { if (e && e.status) return e.status; if (e && ASK_CLIENT_CODES.has(e.code)) return 400; return 500; } function sendError(res, e) { if (res.headersSent) { // 响应已开始(流式文件等)时只能终止连接,与拆分前 writeHead 抛错的表现一致但不崩进程 res.destroy(); return; } const body = { error: (e && e.message) || String(e) }; if (e && e.code !== undefined) body.code = e.code; sendJson(res, errorStatus(e), body); } // 包裹异步处理器:同步/异步异常都进入错误边界 function errorBoundary(handler) { return async (c) => { try { await handler(c); } catch (e) { sendError(c.res, e); } }; } module.exports = { ASK_CLIENT_CODES, errorStatus, sendError, errorBoundary };