Heroku部署API遇OPTIONS替代POST请求问题求助
问题:Heroku部署的API接收托管网站请求时仅返回OPTIONS,POST请求无法触发
我在Heroku上部署了一个API,从本地机器发送POST请求时一切正常,日志显示请求方法为POST;但从托管网站发送请求时,Heroku日志显示请求方法是OPTIONS,功能完全无法运行。已尝试相关解决方案,但未能解决问题。
Heroku日志对比
第一条是本地请求日志,第二条是托管网站请求日志:
2022-10-06T23:57:19.315699+00:00 heroku[router]: at=info method=POST path="/api/smsNotif/applySmsNotif" host=***** request_id=88da98c7-f136-4775-a52a-b10b104b2cff fwd="****" dyno=web.1 connect=0ms service=11ms status=200 bytes=462 protocol=https 2022-10-07T00:01:05.970299+00:00 heroku[router]: at=info method=OPTIONS path="/api/smsNotif/applySmsNotif" host=***** request_id=039a51c3-a976-47f7-bd03-4c52bc71361f fwd="****" dyno=web.1 connect=0ms service=1ms status=204 bytes=277 protocol=https
前端Axios请求代码
api({ method: "POST", url: "/api/smsNotif/applySmsNotif", data: appData, });
后端尝试的修复代码(Express)
const app = express(); app.use(cors({ origin: ['https://forms.ccenttcs.com/', 'http://localhost:9002'], })) app.use(express.json()); app.use(function(req, res, next) { res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); res.setHeader('Access-Control-Allow-Credentials', true); // handle OPTIONS method if ('OPTIONS' == req.method) { return res.sendStatus(200); } else { next(); } });
解决方案建议
- 清理CORS配置冲突:你同时使用了
cors官方包和自定义CORS处理中间件,二者会产生冲突。移除自定义的CORS逻辑,让cors包全权处理预检请求,同时注意去掉origin地址末尾的斜杠(否则会导致域名匹配失败):
const app = express(); // 优先配置CORS,确保在其他中间件之前加载 app.use(cors({ origin: ['https://forms.ccenttcs.com', 'http://localhost:9002'], methods: ['GET', 'POST', 'OPTIONS', 'PUT', 'PATCH', 'DELETE'], allowedHeaders: ['X-Requested-With', 'Content-Type'], credentials: true })); app.use(express.json()); // 后续路由配置...
- 核对前端跨域参数:如果前端的
api实例开启了withCredentials: true,后端必须保持credentials: true配置,且origin不能设为*(你已指定具体域名,符合要求)。 - 检查浏览器控制台:在托管网站的浏览器控制台查看是否有CORS相关报错,直接定位预检请求失败的具体原因。
- 确认Heroku路由规则:排查是否有Heroku插件或自定义Procfile配置拦截了请求方法。
内容的提问来源于stack exchange,提问作者Morgan Hayes
相关产品推荐
相关产品推荐

