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

