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

Express提交数据时出现No Access-Control-Allow-Origin CORS错误求助

问题根源与修复方案

你的CORS错误本质是Express服务根本没真正生效,同时代码里还有多处配置冲突和逻辑问题,具体修复步骤如下:

1. 移除冲突的双服务器配置

你同时创建了原生http服务器和Express服务器,并且让原生服务器占用了3000端口,导致Express的CORS配置、路由完全没被执行。直接删掉原生服务器的代码,改用Express自带的listen启动服务。

2. 清理重复的CORS中间件

你先后调用了app.use(cors(corsOptions))和app.use(cors()),后者会覆盖前者的自定义配置(比如origin、credentials),导致你的CORS规则失效。只保留一次全局CORS配置即可,无需在路由里重复添加。

3. 修复路由文件的核心问题

路由文件里缺少router实例定义,POST接口未给客户端返回响应,还存在严重的SQL注入风险,全部需要修正。


修改后的完整代码

index.js

const express = require('express');
const cors = require('cors');
const { StatusCodes, ReasonPhrases } = require("http-status-codes");

const corsOptions = {
    origin: 'http://localhost', // 若前端在其他端口,改成对应地址如http://localhost:3001
    credentials: true,
    optionSuccessStatus: 200,
}

const app = express();

// 全局CORS配置,放在所有中间件最前面
app.use(cors(corsOptions));
app.use(express.json());

app.get("/", (req, res) => {
    res.status(StatusCodes.OK).json({
        title: "Waiting for request...",
        status: StatusCodes.OK,
    });
});

// 引入路由,无需重复添加cors
const ups = require('./routes/ups.js');
app.use("/ups", ups);

app.all("*", (req, res) => {
    res.status(StatusCodes.METHOD_NOT_ALLOWED).json({
        status: StatusCodes.METHOD_NOT_ALLOWED,
        title: ReasonPhrases.METHOD_NOT_ALLOWED,
    });
});

// 用Express自带的方法启动服务
app.listen(3000, 'localhost', () => {
    console.log('Server running on http://localhost:3000');
});

ups.js

const express = require('express');
const router = express.Router(); // 必须创建router实例
const { StatusCodes, ReasonPhrases } = require("http-status-codes");

module.exports = router;

router.post("/", (req, res) => {
    // 参数校验并返回错误响应
    if (!req.body || req.body.id == null || req.body.available == null) {
        return res.status(StatusCodes.BAD_REQUEST).json({
            status: StatusCodes.BAD_REQUEST,
            title: ReasonPhrases.BAD_REQUEST,
            message: "缺少id或available参数"
        });
    }

    const { id, available } = req.body;

    // 使用参数化查询彻底避免SQL注入
    const sql = "UPDATE `pc_status` SET available = ? WHERE `id` = ?";
    db.query(sql, [available, id], (err, result) => {
        if (err) {
            console.error(err);
            return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
                status: StatusCodes.INTERNAL_SERVER_ERROR,
                title: ReasonPhrases.INTERNAL_SERVER_ERROR,
                message: "数据库更新失败"
            });
        }
        console.log('记录已更新');
        res.status(StatusCodes.OK).json({
            status: StatusCodes.OK,
            message: "更新成功"
        });
    });
});

额外注意事项

  • 前端请求地址要对应:POST http://localhost:3000/ups
  • 若前端运行在非80端口(比如3001),需将corsOptions.origin改成前端的完整地址
  • 永远不要直接拼接用户输入到SQL语句中,参数化查询是必选项,否则会导致严重的安全漏洞

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:34:59