Node.js Lambda中XRay无法捕获抛出错误,显示200 OK问题
解决Node.js Lambda + Middy + XRay错误追踪不生效的问题
问题原因
你的CustomErrorHandling中间件在onError阶段调用handler.callback(null, response)时,第一个参数传入null会告知Lambda函数执行成功,XRay自动追踪会以此为依据将请求标记为200 OK状态,哪怕你返回的响应中包含错误状态码。而默认情况下,Lambda抛出错误时会自动调用callback传入错误对象,XRay会捕获这个错误并标记追踪节点为失败。
解决方案
要让XRay正确捕获错误,需要在自定义错误处理逻辑中手动向XRay的追踪段(Segment)添加错误信息,同时保持自定义响应格式不变。
调整后的中间件代码
import AWSXRay from "aws-xray-sdk"; export const CustomErrorHandling = { onError: (handler, next) => { // 获取当前XRay追踪段 const segment = AWSXRay.getSegment(); if (segment) { // 向追踪段添加错误详情 segment.addError(handler.error); // 标记追踪段为错误状态 segment.error = true; } // 返回自定义错误响应,修正headers的语法问题 return handler.callback(null, { headers: { 'Access-Control-Allow-Origin': '*' }, statusCode: handler.error.statusCode || 500, body: JSON.stringify(handler.error) }); } };
关键说明
- 手动标记XRay错误:通过
AWSXRay.getSegment()获取当前追踪段,调用addError()添加错误对象,并设置segment.error = true,让XRay识别该请求为错误状态。 - 修正响应格式:原代码中
Access-Control-Allow-Origin: *缺少引号会导致语法错误,需修正为'*'。 - 兼容错误状态码:如果
handler.error没有statusCode属性,默认使用500作为响应状态码。
这样调整后,XRay追踪会正确显示调用失败的节点,同时你仍然可以返回自定义格式的错误响应。
内容的提问来源于stack exchange,提问作者user15951701
相关产品推荐
相关产品推荐

