NEST.JS LAMBDA PROXY应用部署AWS后出现CORS错误,POST/PATCH请求异常
问题原因分析
1. Helmet安全策略拦截跨域请求
代码中开启的helmet中间件默认配置的crossOriginResourcePolicy策略值为same-origin,仅允许同域请求访问资源,POST/PATCH这类非简单跨域请求会被该策略直接拦截。
2. 全局异常过滤器未携带CORS头
自定义的全局异常过滤器ServiceExceptionFilter在处理业务异常、参数校验错误等场景时,直接构造返回的响应对象不会自动携带Nest CORS模块添加的跨域头。GET健康检查接口无异常可以正常返回CORS头,因此访问正常;而触发异常的POST/PATCH请求返回的响应缺少跨域头,浏览器就会抛出CORS错误。
3. API Gateway CORS默认配置不匹配请求参数
serverless.yml中将cors设为true使用的是默认配置,存在两种不匹配可能:
- 如果请求携带了自定义请求头,默认允许的请求头列表不包含该自定义头,会导致OPTIONS预检请求失败
- 如果请求携带了Cookie/认证凭证,默认配置
allowCredentials为false,会触发CORS错误
4. Nest CORS配置未覆盖所有场景
nest.enableCors()默认配置虽然允许所有源,但如果需要搭配带凭证的请求,或者需要限制特定源/方法/头,默认配置可能和实际请求规则不匹配,也会引发问题。
对应解决方法
- 调整Helmet配置,显式设置跨域资源策略匹配业务需求:
// 允许跨域访问资源,生产环境可根据需求调整为same-site nestApp.use(helmet({ crossOriginResourcePolicy: { policy: "cross-origin" } }));
- 全局异常过滤器中手动添加CORS响应头,或者继承Nest基础异常逻辑保留跨域头。
- 显式配置serverless.yml的CORS规则,不要使用默认的
cors: true,参考配置:
functions: main: handler: src/lambda.handler events: - http: method: ANY path: /{any+} cors: origin: '*' # 生产环境替换为实际业务域名 allowCredentials: true # 仅需要带凭证的请求开启 allowedHeaders: '*' allowedMethods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']
- 显式配置Nest CORS参数,和API Gateway配置保持一致:
// 生产环境origin替换为实际业务域名 nestApp.enableCors({ origin: '*', credentials: true });
内容的提问来源于stack exchange,提问作者Radik Harutyunyan
相关产品推荐
相关产品推荐

