You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
    });
  }
};

关键说明

  1. 手动标记XRay错误:通过AWSXRay.getSegment()获取当前追踪段,调用addError()添加错误对象,并设置segment.error = true,让XRay识别该请求为错误状态。
  2. 修正响应格式:原代码中Access-Control-Allow-Origin: *缺少引号会导致语法错误,需修正为'*'。
  3. 兼容错误状态码:如果handler.error没有statusCode属性,默认使用500作为响应状态码。

这样调整后,XRay追踪会正确显示调用失败的节点,同时你仍然可以返回自定义格式的错误响应。

内容的提问来源于stack exchange,提问作者user15951701

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:45:59