Node.js跨域请求时遭遇CORS问题求助
CORS跨域问题排查与解决办法
问题原因分析
- 中间件顺序错误:你的代码中
app.use(routes)在app.use(cors())之前执行,导致路由处理逻辑先于CORS中间件生效。浏览器发送的跨域预请求(OPTIONS请求)会直接进入路由处理,无法触发CORS中间件添加必要的响应头,从而触发跨域拦截。 - CORS配置未明确指定允许源:当前代码里
cors()使用默认配置,并未明确限制允许的前端源(http://localhost:5173),和你预期的配置不符。
解决办法
1. 调整中间件顺序并明确CORS配置
将CORS中间件移到路由加载之前,同时指定允许的前端源,确保所有请求先经过CORS校验:
修改后的后端代码:
require("express-async-errors"); const express = require('express'); const AppError = require("./utils/AppError"); const database = require("./database/sqlite"); const uploadConfig = require("./configs/upload"); const cors = require("cors"); database(); const routes = require("./routes"); const app = express(); app.use(express.json()); // 配置CORS中间件,放在路由加载之前 const corsOptions = { origin: 'http://localhost:5173', // 仅允许指定的前端地址跨域 credentials: true, // 若前端需要携带Cookie、Token等凭证,需开启此选项 optionsSuccessStatus: 200 // 兼容部分旧浏览器的OPTIONS请求状态码 }; app.use(cors(corsOptions)); // 加载路由 app.use(routes); app.use((error, request, response, next) => { if(error instanceof AppError) { return response.status(error.statusCode).json({ status: "error", message: error.message }); } console.error(error) return response.status(500).json({ status: "error", message: "Internal server error" }); }); app.use("/files", express.static(uploadConfig.UPLOADS_FOLDER)); const PORT = 3333 app.listen(PORT, () => console.log(`Server is running on Port ${PORT}`))
2. 额外排查要点
- 重启后端服务:修改配置后必须重启服务,否则新配置不会生效。
- 检查自定义请求头:如果前端请求携带了非标准HTTP头(如
Authorization),需在CORS配置中添加allowedHeaders参数,例:allowedHeaders: ['Content-Type', 'Authorization']。 - 测试预请求:用curl手动发送OPTIONS请求验证响应头:
检查响应头中是否存在curl -X OPTIONS http://localhost:3333/sessions -H "Origin: http://localhost:5173" -IAccess-Control-Allow-Origin: http://localhost:5173。
内容的提问来源于stack exchange,提问作者Marcelo Dos Santos
相关产品推荐
相关产品推荐

