请求修复AWS API Gateway与Lambda函数搭配时的CORS跨域问题
你遇到的问题是Web应用调用API Gateway时触发CORS错误,提示has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.,即便已经在Lambda代码中添加了CORS头,且API Gateway启用了CORS配置,问题仍未解决。以下是针对性的排查和修复方案:
1. 处理OPTIONS预检请求
浏览器发送非简单请求(比如带自定义头、PUT/DELETE方法)前,会先发OPTIONS预检请求。如果你的API Gateway代理集成没有正确处理OPTIONS请求,就会导致CORS错误:
- 方案一:在Express中直接处理OPTIONS
安装并使用cors中间件,自动处理OPTIONS请求并添加正确的CORS头:// 在你的Express app文件(app.js)中添加 const cors = require('cors'); app.use(cors({ origin: '*', // 生产环境建议替换为具体域名 methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], allowedHeaders: '*' })); - 方案二:在API Gateway中配置MOCK集成处理OPTIONS
避免OPTIONS请求走到Lambda,直接由API Gateway返回CORS响应:- 在API Gateway的资源下创建
OPTIONS方法 - 集成类型选择
MOCK - 在"方法响应"中添加
Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers响应头 - 部署API到对应阶段
- 在API Gateway的资源下创建
2. 为错误分支添加CORS头
你的Lambda代码中,try块的响应添加了CORS头,但catch块返回的500错误响应没有包含这些头。如果请求触发了异常(比如数据库连接失败),浏览器会因为响应缺少CORS头而报错。修改catch块:
catch (err) { console.error("Failed to process request: ", err); return { statusCode: 500, headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "*", "Access-Control-Allow-Headers": "*", }, body: JSON.stringify({ error: "Internal Server Error" }), }; }
3. 确认API Gateway已重新部署
修改API Gateway的CORS配置或资源后,必须重新部署对应的阶段,否则新配置不会生效。在API Gateway控制台的"部署API"选项中,选择当前阶段重新部署。
4. 检查Express中间件是否覆盖响应头
如果你的Express应用中有其他中间件(比如安全中间件、自定义响应处理),可能会覆盖Lambda代码中添加的CORS头。优先使用cors中间件配置CORS,确保头被正确设置。
5. 验证响应头是否正确返回
使用Postman或curl直接调用API,查看响应头是否包含Access-Control-Allow-Origin:
curl -I https://your-api-id.execute-api.region.amazonaws.com/stage/resource-path
如果响应头中没有该字段,说明Lambda或API Gateway的配置仍有问题,需要进一步排查。
内容的提问来源于stack exchange,提问作者ישי ביטון

