Node.js 使用POST API时获取多个CORS错误

Node.js 使用POST API时获取多个CORS错误,node.js,post,aws-lambda,cors,aws-api-gateway,Node.js,Post,Aws Lambda,Cors,Aws Api Gateway,我在尝试通过POST请求上载图像时遇到多个CORS错误。我在AWSAPI网关上创建了一个POST API,它触发了一个用NodeJS编写的lambda函数。该API与Postman配合良好,因为它允许CORS,但在不同的浏览器上会出现多个错误 错误如下:- 在Firefox上 论铬 下面是请求头:- Method request headers: { sec - fetch - mode = cors, sec - fetch - site = cro

我在尝试通过POST请求上载图像时遇到多个CORS错误。我在AWSAPI网关上创建了一个POST API,它触发了一个用NodeJS编写的lambda函数。该API与Postman配合良好,因为它允许CORS,但在不同的浏览器上会出现多个错误

错误如下:-

  • 在Firefox上

  • 论铬
下面是请求头:-

Method request headers: {
        sec - fetch - mode = cors,
        sec - fetch - site = cross - site,
        accept - language = en - US,
        en;q = 0.9,
        hi;q = 0.8,
        access - control - allow - headers = Origin,
        X - Requested - With,
        Content - Type,
        Accept,
        Authorization,
        origin = null,
        User - Agent = Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 76.0 .3809 .100 Safari / 537.36,
        X - Forwarded - Proto = https,
        Host = xxxxxxx.execute - api.us - east - 2. amazonaws.com,
        X - Forwarded - Port = 443,
        X - Amzn - Trace - Id = Root = 1 - 5 d5fd816 - 4 c1ac880ed09a50047ecda00,
        accept = * /*, access-control-allow-origin=*, X-Forwarded-For=103.97.240.210, content-type=application/json, accept-encoding=gzip, deflate, br}
Chrome上的请求标题

以下是**响应标题:-**

Endpoint response headers: {
    Date = Fri,
    23 Aug 2019 12: 12: 07 GMT,
    Content - Type = application / json,
    Content - Length = 1077,
    Connection = keep - alive,
    x - amzn - RequestId = 46 a264c2 - 44 d7 - 4026 - 9168 - f227e758f078,
    X - Amz - Function - Error = Unhandled,
    x - amzn - Remapped - Content - Length = 0,
    X - Amz - Executed - Version = $LATEST,
    X - Amzn - Trace - Id = root = 1 - 5 d5fd816 - 4 c1ac880ed09a50047ecda00;sampled = 0
}
邮差上的响应标题

下面是我的代码 客户端:index.html

<body>

<form method="post" enctype="application/json">

    Enter the Employee Id: <input type="text" name="empId"><br>
    Upload the Employee Photo: </h2><input type="file" name="PhotoName"> <br>
    <input type="submit" name="PhotoContent" value="Upload Photo"><br><br>
</form>
</div>

 <script src="upload.js"></script>

</body>

如有任何建议,将不胜感激。提前感谢。

将访问控制允许Origin设置为null将不允许所有来源。改为将其设置为
*

"headers": {
            "Access-Control-Allow-Origin": "*"
        },

将Access Control Allow Origin设置为null将不允许所有源。改为将其设置为
*

"headers": {
            "Access-Control-Allow-Origin": "*"
        },

您需要为您的资源创建一个OPTIONS方法,使用一个模拟响应将这些头发送回,并允许在API网关上使用这些头。如果您选择api网关上的资源并单击顶部下拉列表,单击启用cors,它将为您设置该资源/方法,并引导您完成直观的工作流程,以允许这些资源/方法在客户端和后端之间来回传递它们的值(在本例中为lambda)

您还可以指定允许“*”或子集('GET,POST')的方法

试试这些:

"Access-Control-Allow-Methods": "'*'",
"Access-Control-Allow-Headers": "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'",
"Access-Control-Allow-Origin": "'*'"

AWS API Gateway CORS文档

您需要为您的资源创建一个选项方法,使用一个模拟响应将这些头发送回,并允许在API Gateway上使用这些头。如果您选择api网关上的资源并单击顶部下拉列表,单击启用cors,它将为您设置该资源/方法,并引导您完成直观的工作流程,以允许这些资源/方法在客户端和后端之间来回传递它们的值(在本例中为lambda)

您还可以指定允许“*”或子集('GET,POST')的方法

试试这些:

"Access-Control-Allow-Methods": "'*'",
"Access-Control-Allow-Headers": "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'",
"Access-Control-Allow-Origin": "'*'"

AWS API网关CORS文档

最后,问题得到解决

  • 我得到了403响应代码,因为我使用了不正确的端点
  • 我收到CORS错误,因为没有对服务器端代码进行异常处理。在异常情况下,代码未在响应中发送CORS头
最后,问题得到了解决

  • 我得到了403响应代码,因为我使用了不正确的端点
  • 我收到CORS错误,因为没有对服务器端代码进行异常处理。在异常情况下,代码未在响应中发送CORS头

CORS头应该设置在服务器端。尝试将
'Access-Control-Allow-Origin':“*”
'Access-Control-Allow-Headers':“Origin,X-Requested-With,Content-Type,Accept,Authorization”
添加到服务器的响应中。您好@Teh即使在将上述头添加到服务器端节点js代码之后,我仍然收到相同的错误。@Teh我还有一个疑问是,如果我已经在OPTIONS方法上启用了CORS头,我是否还必须为同一资源下的POST方法添加相同的头?因为目前,我已经在OPTIONS方法上启用了CORS,并且还从POST方法的节点Js代码发送相同的头。它会在头中产生冲突吗?CORS头应该设置在服务器端。尝试将
'Access-Control-Allow-Origin':“*”
'Access-Control-Allow-Headers':“Origin,X-Requested-With,Content-Type,Accept,Authorization”
添加到服务器的响应中。您好@Teh即使在将上述头添加到服务器端节点js代码之后,我仍然收到相同的错误。@Teh我还有一个疑问是,如果我已经在OPTIONS方法上启用了CORS头,我是否还必须为同一资源下的POST方法添加相同的头?因为目前,我已经在OPTIONS方法上启用了CORS,并且还从POST方法的节点Js代码发送相同的头。它会在头文件中产生冲突吗?我已经在服务器端和客户端代码中添加了“访问控制允许源文件”:“*”头文件。我仍然收到相同的CORS错误。您发布的代码显示不是这样,但可以。客户端不需要它,它是一个响应头。我已经在服务器端和客户端代码上添加了“访问控制允许源”:“*”头。我仍然收到相同的CORS错误。您发布的代码显示不是这样,但可以。客户端不需要它,这是一个响应头。谢谢你的回复。我在创建API的同时启用了CORS,同时还创建了OPTIONS方法。我已经尝试按照您的建议更新OPTIONS方法头,但仍然会出现相同的错误。但是,当我从浏览器调用API时,我只看到POST方法,而没有看到OPTIONS方法。还好吗?我还在POST请求上看到403响应代码,在Firefox上有响应-{“message”:“缺少身份验证令牌”},在Chrome上没有响应。我不认为这是一个身份验证问题,因为我可以在没有令牌的情况下从postman访问API。我还有一个疑问,如果我已经在OPTIONS方法上启用了CORS标头,那么我是否还必须为同一资源下的POST方法添加相同的标头。因为目前,我已经在OPTIONS方法上启用了CORS,并且还从POST method.Strange的节点Js代码发送了头。您能为选项和post方法发布请求方法配置吗?我会尝试在舞台上启用CloudWatch访问日志,随后尝试从浏览器和postman点击API端点几次,然后发布这些日志。我已经启用了CloudWatch日志。问题解决了。以前,我得到的是403响应代码,因为我使用的端点不正确。即使在纠正之后