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

CORS配置后POST请求报错:预检请求未通过访问控制检查

问题排查与解决方案

你的代码里存在几个明确的问题,直接导致POST等修改类请求的预请求(OPTIONS)失败,以下是逐一修复方案:

1. 允许的Origin地址末尾多了斜杠

allowedOrigins里写的是'http://localhost:3000/',但浏览器实际发送的Origin是不带末尾斜杠的'http://localhost:3000',这会导致CORS匹配失败,预请求得不到正确的Access-Control-Allow-Origin响应头。

修复:
修改allowedOrigins,去掉末尾斜杠:

const allowedOrigins = [
    'http://localhost:3000'
]

2. 重复定义CorsOptions导致配置被覆盖

你先自行定义了CorsOptions对象,随后又通过require('./config/CorsOptions')重新赋值,这会把前面写的配置完全覆盖。如果config文件里的配置存在问题,就会直接生效导致当前配置失效。

修复:
删掉重复的require语句,确保使用当前定义的CorsOptions:

// 移除这行:const CorsOptions = require('./config/CorsOptions')

如果你的配置确实放在config文件中,就删掉当前文件里的CorsOptions定义,仅使用require进来的版本,同时检查config文件里的配置是否正确。

3. CORS配置属性名大小写错误

你写的Credentials: true是大写开头,但cors中间件的配置属性是小写的credentials,大写属性名会被中间件忽略,这会影响凭证请求处理,也可能间接导致预请求异常。

修复:
改成小写:

const CorsOptions = {
    origin: allowedOrigins,
    credentials: true, // 此处改为小写
    methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],
    allowedHeaders: ['Content-Type'],
    optionsSuccessStatus: 204
}

4. 调整中间件顺序

确保app.use(cors(CorsOptions))加载在所有路由和解析中间件(比如express.json()、urlencoded)之前,预请求需要先经过CORS中间件处理,否则请求会被先解析但无法获取CORS响应头。

正确顺序示例:

const cors = require('cors')
const allowedOrigins = ['http://localhost:3000']
const CorsOptions = {
    origin: allowedOrigins,
    credentials: true,
    methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],
    allowedHeaders: ['Content-Type'],
    optionsSuccessStatus: 204
}

// 先加载CORS中间件
app.use(cors(CorsOptions))
// 再加载解析中间件
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
// 最后加载路由
// app.use('/workout', workoutRouter)

验证修复

修改后重启服务器,再次发送POST请求即可正常通过预请求。如果仍有问题,可在浏览器开发者工具的「网络」标签中查看OPTIONS请求的响应头,确认是否包含Access-Control-Allow-Origin、Access-Control-Allow-Methods等必要字段。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:45:23