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

Express.js后端CORS错误:预检请求无HTTP成功状态码

问题分析与解决方案

核心原因

你遇到的CORS错误是因为浏览器发送的OPTIONS预请求未得到2xx成功响应。Kotlin APP属于非浏览器环境,不会触发CORS预请求机制,因此能正常访问;而React前端在跨域发送非简单请求(比如带JSON格式Body的POST)时,浏览器会自动先发OPTIONS预请求验证权限,你的后端当前未正确处理该请求,导致预请求返回非2xx状态,被CORS策略拦截。

具体修复步骤

1. 手动处理OPTIONS预请求

当前代码的service.all('/*')中间件仅设置了CORS头,但未处理OPTIONS请求,而是直接next(),导致OPTIONS请求走到后续路由无对应处理逻辑,返回404或错误状态。修改中间件,直接响应OPTIONS请求:

service.all('/*', function(req, res, next) {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader("Access-Control-Allow-Credentials", "false");
  res.setHeader("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
  res.setHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
  // 直接响应OPTIONS预请求,无需进入后续路由
  if (req.method === 'OPTIONS') {
    return res.sendStatus(200);
  }
  next();
});

2. 改用官方cors包简化配置

手动编写CORS头易出错,推荐使用Express官方维护的cors包,它会自动处理OPTIONS预请求:

  • 安装依赖:npm install cors
  • 修改后端代码:
require("dotenv").config();
const express = require("express");
const listen = require("./listen");
const bodyParser = require("body-parser");
const cors = require('cors');
const service = express();

// 配置并使用cors中间件
service.use(cors({
  credentials: false,
  origin: '*',
  methods: ['GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
}));

service.use(bodyParser.urlencoded({ extended: false }));
service.use(bodyParser.json());
service.set("view engine", "ejs");

service.post("/", async (req, res) => {
  if(req.body.test == "hello_world") {
    res.json({ server: "hello" })
  } else {
    // 补充默认响应逻辑,避免请求挂起
    res.sendStatus(400);
  }
});

listen(service);

3. 检查HTTPS部署的额外配置

若后端部署在Nginx等反向代理后,需确保代理服务器未覆盖或拦截CORS头:

  • 确认Nginx配置未添加冲突的CORS规则,或直接让Express处理CORS,Nginx仅做转发。
  • 检查axios请求的URL是否为完整HTTPS地址,比如axios.post("https://myurl.net/", ...),当前代码未加协议头可能导致请求异常。

4. 完善路由响应逻辑

你的POST路由仅在req.body.test == "hello_world"时返回响应,其他情况会导致请求挂起(无res.send/res.json),建议补充默认响应逻辑,避免引发额外异常。

内容的提问来源于stack exchange,提问作者user18680403

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:33:19