You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:35:26