AWS API Gateway - 尽管遵循以下教程,但仍出现 CORS 错误

Jos*_*rth 5 amazon-web-services cors aws-lambda aws-api-gateway aws-sam

我有一个 sam 文件试图构建 lambda 函数的 API 网关。我正在遵循最新的AWS 文档来配置 cors。该文档引用如下:

在此输入图像描述

正如您可能已经猜到的那样,这对我不起作用。如果我使用“http://localhost:3000”或其变体作为“AllowOrigin”属性,则会收到以下错误:

CORS 策略已阻止从源“http://localhost:3000”访问“xxx”处的 XMLHttpRequest:请求的资源上不存在“Access-Control-Allow-Origin”标头。

检查 API 网关,该属性确实存在。尽管它似乎只存在于选项中,而不存在于“ANY”部分。

在此输入图像描述

如果我将其更改为AllowOrigin: "'*'",则会收到以下错误:

从源“http://localhost:3000”访问“xxxx”处的 XMLHttpRequest 已被 CORS 策略阻止:“Access-Control-Allow-Origin”标头包含多个值“*、*”,但只允许一个。

除此之外,还创建了一个单独的“Stage”阶段,我不明白该阶段,并且我不确定代理是否需要存在或在 SAM 文件中的位置创建。

这是我的 sam 的 yaml 文件。

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: Storygraf backend API

Globals:
  Function:
    Timeout: 3

Resources:
  ExpressApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: dev
      Cors:
        AllowOrigin: "'*'"
        AllowMethods: "'POST, GET, PUT, DELETE'"
        AllowHeaders: "'X-Forwarded-For, Content-Type'"

  ExpressLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./
      Handler: lambda.handler
      MemorySize: 512
      Runtime: nodejs14.x
      Timeout: 30
      Events:
        ProxyApiRoot:
          Type: Api
          Properties:
            RestApiId: !Ref ExpressApi
            Path: /
            Method: ANY
        ProxyApiGreedy:
          Type: Api
          Properties:
            RestApiId: !Ref ExpressApi
            Path: /{proxy+}
            Method: ANY
Run Code Online (Sandbox Code Playgroud)

更新

看起来测试在通过代理时有效,但在使用非代理 GET 命令时没有任何可用。

在此输入图像描述

在此输入图像描述

更新

我发现打包过程正在更改引号,但这似乎不是问题。

Sni*_*192 1

从您的日志中,access-control-allow-origin您的测试返回的标头GET返回一个带有['*','*']. 它不应该是一个数组,而应该只是一个'*'

编辑 在此输入图像描述