【发布时间】:2019-01-31 05:59:53
【问题描述】:
我正在构建一个应用程序,该应用程序通过 Web (React) 前端上使用的 AWS Amplify 与 AWS (API Gateway/Lambda) 上的无服务器 API 连接。
当请求成功时,一切正常(当然,我想)。没有CORS问题或任何东西。但是,如果我尝试返回“失败”响应,我的前端不会收到该响应。它收到一个通用的Network Error,没有关于发生了什么的信息,控制台记录了一个失败。
我认为代码会更有意义。我使用这样的代码向 API 请求(在其他地方配置放大):
import { API } from 'aws-amplify';
...
API.get('apiName', path, options)
.then(response => {
// Whatever
})
.catch(err => {
// Whatever
})
在 Lambda 中,我返回(并且 Cloudwatch 验证了这一点,因为我在运行 callback(null, responseObject) 之前就记录了)一个完整的响应对象,如下所示:
{
"statusCode": 200,
"headers": {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": true
},
"body": "{ /* whatever */ }"
}
或者这个:
{
"statusCode": 500,
"headers": {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": true
},
"body": "{ /* error here */ }"
}
在200 的情况下,响应完美地到达了我的前端(在.then 函数中显示为response)。在500(或一般错误)情况下,.catch 被称为并且err 对象不是我放在响应正文中的,而是没有相关信息(或状态码)的通用Network Error:
Error: Network Error
at createError (createError.js:16)
at XMLHttpRequest.handleError (xhr.js:87)
为了澄清,只需 将 statusCode 从 200 更改为 400 都意味着请求在前端被捕获(很好),并且错误没有我返回的任何信息Lambda(坏)。
控制台也会记录错误:
DELETE https://abcdefg.execute-api.us-west-2.amazonaws.com/development/my-endpoint 403 ()
Failed to load https://abcdefg.execute-api.us-west-2.amazonaws.com/development/my-endpoint: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 403.
它还会记录与我没有意义的 CORS 失败相关的内容,因为我遵循与成功案例相同的exact模式,只是使用了更高的statusCode。
Cross-Origin Read Blocking (CORB) blocked cross-origin response https://abcdefg.execute-api.us-west-2.amazonaws.com/development/my-endpoint with MIME type application/json.
XHR failed loading: DELETE "https://abcdefg.execute-api.us-west-2.amazonaws.com/development/my-endpoint".
知道这里发生了什么吗?无法访问前端真正的信息错误真的很令人沮丧。如果有任何其他信息有助于解决此问题,请告诉我。
编辑 -- 根据@Michael 下面的反馈,我检查了我的应用程序使用的是 lambda 还是 lambda-proxy,事实上,它使用的是 lambda-proxy,应该 not 据我了解,不会产生这种行为。
这是我的 serverless.yml 文件中的一些代码,
functions:
projectsGetAll:
handler: handlers/projects/getAll.handler
events:
- http:
path: projects
method: get
cors: true
authorizer: aws_iam
这是来自 AWS API Gateway 的针对这些端点之一的屏幕截图(端点被涂白):
我想确认这是 lambda-proxy 的意外行为。是不是有些设置搞砸了?
【问题讨论】:
标签: reactjs amazon-web-services aws-lambda serverless-framework aws-amplify