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

Node.js跨域请求时遭遇CORS问题求助

CORS跨域问题排查与解决办法

问题原因分析

  1. 中间件顺序错误:你的代码中app.use(routes)在app.use(cors())之前执行,导致路由处理逻辑先于CORS中间件生效。浏览器发送的跨域预请求(OPTIONS请求)会直接进入路由处理,无法触发CORS中间件添加必要的响应头,从而触发跨域拦截。
  2. 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" -I
    
    检查响应头中是否存在Access-Control-Allow-Origin: http://localhost:5173。

内容的提问来源于stack exchange,提问作者Marcelo Dos Santos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:02:50