React Native中AWS Amplify无法获取Lambda自定义错误消息
解决AWS Amplify v6调用API Gateway无法获取自定义错误消息的问题
问题分析
使用AWS Amplify v6的post方法调用API Gateway时,当Lambda返回400等非2xx状态码,catch块中只能拿到UnknownError,无法直接获取Lambda返回的自定义错误消息——尽管Postman能正常接收完整错误响应。这是因为Amplify v6在处理非2xx响应时会抛出封装后的错误,原始响应体需要从错误对象中提取。
解决方案
方案1:在Catch块中提取错误响应体
修改组件中的错误处理逻辑,从error.response中获取原始响应并解析:
async function createOrg() { try { const response = await apiUtils.createOrganization({ orgName: orgName, }); setOrganization(response); } catch (error) { console.log('Error!'); // 提取并解析错误响应体 if (error.response) { try { const errorBody = await error.response.body.json(); console.log('错误消息:', errorBody.error.response.body); } catch (parseError) { console.log('解析错误响应失败:', parseError); } } console.log(JSON.stringify(error)); } }
方案2:在API工具层统一处理响应状态
修改apiUtils.js,先获取完整响应,判断状态码后自行处理错误,避免Amplify自动抛出错误:
createOrganization: async (body) => { const restOperation = post({ apiName: API_NAME, path: "/organizations", options: { body: body, }, }); const response = await restOperation.response; // 检查响应状态是否正常 if (!response.ok) { const errorData = await response.body.json(); // 抛出包含自定义错误消息的异常 throw new Error(errorData.error.response.body); } return await response.body.json(); }
方案3:确保Lambda返回正确的响应头
Lambda返回响应时,必须设置Content-Type: application/json头,否则Amplify可能无法正确解析响应体:
if (!isValidOrgName(orgName)) { return new APIGatewayProxyResponseEvent() .withStatusCode(HttpStatusCode.BAD_REQUEST) .withHeaders(Map.of("Content-Type", "application/json")) .withBody(objectMapper.writeValueAsString(ErrorHelper.buildError(HttpStatusCode.BAD_REQUEST, "Org name should not contain special characters."))); }
原理说明
Amplify v6的REST客户端在收到非2xx状态码时,会将响应封装到UnknownError的response属性中。通过访问该属性并解析响应体,就能获取Lambda返回的自定义错误消息。同时,正确设置响应头是确保响应体能被正常解析的前提。
内容的提问来源于stack exchange,提问作者Alex Green
相关产品推荐
相关产品推荐

