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
相关产品推荐
相关产品推荐

