API 网关,被 CORS 策略阻止:否 'Access-Control-Allow-Origin' header

API Gateway, blocked by CORS policy: No 'Access-Control-Allow-Origin' header

我知道这个问题可能会重复,但是 none 现有问题指向我没有做的任何事情...

我已经使用无服务器框架部署了一个 API,但我在使用 CORS 时遇到了问题。

我正在使用 axios 执行获取请求:

axios.get('https://test.execute-api.us-west-1.amazonaws.com/dev/test?from=2012-01-09T21:40:00Z')
     .then(response => {
       this.data = response.data;
     })
     .catch(error => console.log(error))

我收到以下错误:

Access to XMLHttpRequest at 'https://test.execute-api.us-west-1.amazonaws.com/dev/test?from=2012-01-09T21:40:00Z' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我已经做过的事情:

此外,我的 Lambda 函数的响应返回以下 headers:

return events.APIGatewayProxyResponse{
    StatusCode: http.StatusOK,
    Headers: map[string]string{
        "Access-Control-Allow-Origin":      "http://localhost:8080",
        "Access-Control-Allow-Credentials": "true",
    },
    Body: string(jsonEvents),
}, nil

我也试过将 Access-Control-Allow-Origin 设置为 '*'

我的 serverless.yml 文件在每个函数事件上都有 cors: true

functions:
  deploymentFrequency:
    handler: bin/update/deployment-frequency
    events:
      - http:
          path: deployment-frequency
          method: post
          cors: true
  fetchDeploymentFrequency:
    handler: bin/fetch/deployment-frequency
    events:
      - http:
          path: deployment-frequency
          method: get
          cors: true

我错过了什么?似乎没有任何效果。 Postman 的请求工作正常,它看起来包含 headers,因此这似乎是 OPTIONS 方法的问题。

我的配置是:

(event, context, callback) => {
   callback(null, {
      statusCode: (code || 200),
      body: JSON.stringify(resp),
      headers: { 'Access-Control-Allow-Origin': '*'},
   });
}

对我来说效果很好。我以前遇到过和你一样的问题,但只要你用 CORS: true 定义你的函数并且你的响应包含 header,你应该没问题。

注意:我不理解语法 "map[string]string",在这种情况下不需要凭据。

原来我忽略了响应中的状态码:(

我意识到我实际上遇到了两个错误:

  • 缺少 Content-Type header
  • 的 406 状态代码
  • CORS 错误

第一个错误是因为我没有将 Content-Type header 传递给请求(我检查了我的代码我完全忘记了期望 header) .

第二个错误是因为我没有将Access-Control-Allow-Origin header添加到我的函数的错误响应中。

启用Lamba 代理集成

return events.APIGatewayProxyResponse{
    StatusCode: http.StatusOK,
    Headers: map[string]string{
        "Access-Control-Allow-Origin": "*",
        "Content-Type": "application/json",
    },
    Body: string(jsonEvents),
}, nil