【发布时间】:2020-11-07 14:59:18
【问题描述】:
我有一个与 Lambda 函数集成的 API 网关(HTTP 类型)。我正在尝试从 localhost 调用该函数,如下所示:
const jwt = getAuthToken();
const formBody = new FormData();
formBody.set('user', 'test');
const res = await fetch('https://example.execute-api.eu-west-1.amazonaws.com/default/GetShareValue', {
method: 'POST',
body: formBody,
headers: {
'Authorization': jwt
}
});
但是,我收到以下错误消息:
访问获取地址 'https://example.execute-api.eu-west-1.amazonaws.com/default/GetShareValue' 来自原点“http://localhost:3000”已被 CORS 策略阻止: 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。如果不透明的响应满足您的需求,请设置请求的 模式为“no-cors”以获取禁用 CORS 的资源。
我了解不正确的 CORS 设置会阻止浏览器显示 Lambda 函数返回的内容。但是,我的 API Gateway 指定了 CORS 设置:
According to this thread,在 Lambda 函数的响应中设置标头很重要。我已将它们设置为相同。这是我的 Lambda 函数:
exports.handler = async (event, context) => {
let body;
let statusCode = '200';
const headers = {
'Content-Type': 'application/json',
"Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,X-Amz-Security-Token,Authorization,X-Api-Key,X-Requested-With,Accept,Access-Control-Allow-Methods,Access-Control-Allow-Origin,Access-Control-Allow-Headers",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "*",
"X-Requested-With": "*"
};
try {
body = "Success!!";
} catch (err) {
statusCode = '400';
body = err.message;
} finally {
body = JSON.stringify(body);
}
return {
statusCode,
body,
headers,
};
};
我可以在 Postman 中调用这个端点——它不关心 CORS——所以我知道它正在工作。我开始认为这是 AWS 本身的一个错误。
【问题讨论】:
-
您是否尝试过重新部署 API?
-
是的,我创建了另一个相同的 API,它也有同样的问题。
-
好吧,我最终将 API 网关重新创建为 REST API 而不是 HTTP API。即便如此,我在 AWS 文档中深埋的解决方案也遇到了 CORS 问题。从用户体验的角度来看,这是一个糟糕的平台。相比之下,Azure 轻而易举。
-
您介意分享解决方案吗?我同意 CORS 对 API Gateway 来说是一个古怪的过程。
-
嗨,彼得。我将发布我的解决方案作为这个问题的答案。
标签: amazon-web-services aws-lambda cors aws-api-gateway