如何将AWS Lambda自定义错误信息传递至客户端控制台?
看起来你遇到的问题是前端无法正确提取Lambda返回的自定义错误体,但网络面板里能看到内容,核心原因有两个:一是Lambda响应格式的小疏漏,二是前端错误处理的方式不对。下面分两步解决:
第一步:修正Lambda的响应格式(符合API Gateway代理集成要求)
你的buildResponse函数里,body直接传入了JS对象,但API Gateway Lambda代理集成要求body必须是JSON字符串。虽然浏览器网络面板能看到解析后的内容,但这可能导致前端请求库(比如axios)在解析响应时出现异常,无法正确映射到错误对象中。
修改buildResponse函数,把body转成JSON字符串:
function buildResponse(statusCode, body) { return { statusCode: statusCode, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': true }, body: JSON.stringify(body) // 关键:将对象转为JSON字符串 }; }
这样Lambda返回的响应就完全符合API Gateway的规范,避免了潜在的解析问题。
第二步:前端正确处理错误响应
不同的HTTP请求库(axios/fetch)对错误的处理逻辑不同,下面分别给出解决方案:
如果使用Axios:
Axios会把所有状态码不在2xx范围内的响应抛进catch,但错误对象里的response.data才是Lambda返回的自定义错误体。你之前看到的"Request failed with status code 500"只是Axios默认生成的错误消息,需要手动提取response.data中的内容:
try { const res = await axios.post('/your-api-endpoint', yourData); // 处理成功响应 } catch (error) { if (error.response) { // 服务器返回了错误响应,提取自定义信息 const { status, error: customError } = error.response.data; console.log('自定义错误:', customError); // 这里就能拿到"My error" // 将错误信息展示给用户 alert(`出错了:${customError}`); } else { // 网络错误或其他请求问题 console.error('请求异常:', error.message); } }
如果使用Fetch:
Fetch的逻辑有所不同——它只有网络错误(比如断网)才会进入catch,状态码4xx/5xx的响应不会自动抛出错误,需要手动判断并处理:
try { const res = await fetch('/your-api-endpoint', { method: 'POST', body: JSON.stringify(yourData), headers: { 'Content-Type': 'application/json' } }); if (!res.ok) { // 状态码不在2xx范围,手动解析错误体并抛出 const errorData = await res.json(); throw new Error(errorData.error || `请求失败:${res.status}`); } const result = await res.json(); // 处理成功响应 } catch (error) { // 这里就能捕获到自定义错误信息 console.error('错误:', error.message); alert(`出错了:${error.message}`); }
额外注意:不要在Lambda里直接throw Error
你之前尝试throw new Error('My error')会导致API Gateway返回502错误,因为Lambda抛出未捕获的异常时,API Gateway会判定为服务端内部错误,无法正确传递自定义信息。正确的做法始终是返回符合格式的响应对象(就像你用failure函数那样)。
内容的提问来源于stack exchange,提问作者Glanyx

