生产环境需拦截、脱敏、上报异步错误,禁止暴露敏感信息:递归清洗错误对象与堆栈中的token、password等字段,正则匹配凭证格式;自定义序列化替代JSON.stringify;重写console.error仅输出脱敏后类型与消息;fetch/Axios错误中剥离原始响应体与headers;关闭Source Map、禁用Apollo errorPolicy: "all"、CSP限制上报端点。

生产环境中不能直接隐藏异步错误,而是要拦截、脱敏、上报、不暴露——关键不是“屏蔽”,而是让错误不泄露敏感内容,同时确保可观测性不丢失。
过滤日志和上报中的敏感字段
所有错误信息在打印或发送前必须清洗。常见敏感字段包括:token、password、creditCard、auth、cookie、authorization 等。
- 用递归遍历错误对象(如
event.reason或error.stack)识别并替换敏感值,不依赖字段名硬匹配,可结合正则检测典型凭证格式(如sk_live_.*、Bearer [a-zA-Z0-9._-]+) - 对
stack字符串做关键词模糊擦除,例如将"token=abc123"替换为"token=[REDACTED]",保留行号与调用结构便于定位 - 避免使用
JSON.stringify(error)直接上报,改用自定义序列化函数,跳过不可枚举属性和敏感键
禁止在控制台输出原始错误详情
开发时 console.error(err) 很方便,但生产环境必须降级:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 重写
console.error,仅输出错误类型(err.name)和简短消息(err.message),且对消息做关键词过滤 - 禁用
console.trace()和完整堆栈输出;如需调用链,改用轻量快照(如new Error().stack.split('\n').slice(0, 4).join('\n')) - 在
unhandledrejection和error全局监听中,不调用console.error(event.reason),而是走统一脱敏上报管道
服务端响应与请求参数的前端脱敏
很多敏感信息来自接口返回或请求体,错误上下文里容易带出:
立即学习“Java免费学习笔记(深入)”;
- fetch 或 Axios 请求失败时,不要把
response.body或request.headers原样塞进错误 payload;只保留状态码、URL 路径、方法,以及脱敏后的 query 参数(如?user_id=123&token=[REDACTED]) - 对后端返回的 error 字段(如
message、details)做白名单校验:只透传预设安全字段(如"invalid_email"),其余一律替换为泛化提示("request_failed") - 若错误源自 GraphQL 请求,避免在客户端拼接
errors[0].message—— 后端应统一返回用户友好 code,前端查表映射,不暴露原始 message
配置层面切断敏感信息外泄路径
有些泄露不靠代码,而靠默认行为:
- 关闭 Source Map 的线上部署(构建时设
devtool: false),防止堆栈还原出源码逻辑和变量名 - 禁用 Apollo Client 的
errorPolicy: "all"模式,避免把 GraphQL 字段级错误(含未授权数据)透传到前端错误对象 - 在 CSP 中限制
report-uri或report-to指向可信上报端点,防止错误报告被中间人劫持

















