MERN栈项目GET请求返回404错误问题求助
问题描述
MERN栈项目本地调试时,GET接口请求始终返回404错误,相关代码如下:
入口文件 server/index.js
import express from "express"; import mongoose from "mongoose"; import cors from "cors"; import usersRoutes from "./routes/users.route.js"; const app = express(); app.use(cors()); app.use("/users", usersRoutes); const CONNECTION_URL = "mongodb+srv://..."; const PORT = process.env.PORT || 3001; mongoose.connect(CONNECTION_URL); app.listen(PORT, () => { console.log(`Server running on Port: http://localhost:${PORT}`); });
路由文件 server/routes/users.route.js
import express from "express"; import UserModel from "../models/Users.js"; const router = express.Router(); router.get("/getUsers", (req, res) => { UserModel.find({}, (err, result) => { if (err) { res.json(err); } else { res.json(result); } }); }); export default router;
模型文件 server/models/Users.js
import mongoose from "mongoose"; const UserSchema = new mongoose.Schema({ name: { type: String, required: true, }, age: { type: Number, required: true, }, username: { type: String, required: true, }, }); const UserModel = mongoose.model("users", UserSchema); export default UserModel;
问题原因
404错误本质是请求的路径在服务端没有匹配到对应路由,结合代码逻辑,90%以上的概率是以下原因:
- 请求路径不匹配:用户路由被挂载在
/users前缀下,路由内部定义的路径是/getUsers,因此接口完整路径为http://localhost:<服务端口>/users/getUsers,如果直接请求/getUsers或者根路径,必然返回404。 - 请求发错端口/未配置代理:MERN栈前端默认运行在3000/5173等开发端口,后端运行在3001端口,如果前端发请求时没有写全后端地址,也没有配置开发代理,请求会被发送到前端服务的端口,前端服务没有对应路由自然返回404。
- 路由未正确加载:如果导入路由时文件路径、文件名大小写写错(Windows不区分文件名大小写,但macOS/Linux区分),路由文件加载失败,所有
/users开头的请求都会返回404。
修复步骤
- 第一步:确认服务启动状态
启动后端后先看控制台有没有报错,如果出现模块找不到的错误,优先检查import语句里的文件路径、文件名大小写,确保路由文件被正确加载。如果没有报错,记录控制台打印的实际监听端口,避免端口被占用导致服务跑在非预期端口上。 - 第二步:校验后端路由可用性
在入口文件添加根路径测试路由,快速验证服务是否正常响应:
先用浏览器/Postman访问// 加在app.use("/users", usersRoutes);前面即可 app.get("/", (req, res) => res.send("Server is running"));http://localhost:<实际监听端口>/,如果能看到返回内容,再访问http://localhost:<实际监听端口>/users/getUsers,如果这个地址能正常返回数据,说明后端路由本身没有问题,故障出在前端请求配置上。 - 第三步:修复前端请求配置
要么前端请求时写全后端完整地址,以axios为例:
要么给前端开发服务配置代理,将axios.get("http://localhost:3001/users/getUsers")/users开头的请求转发到后端3001端口,不用每次写全后端地址。 - 第四步:补全必要中间件(非404诱因,但必须添加,否则后续POST接口会无法解析请求体)
在app.use(cors())后添加两行中间件:app.use(express.json()); app.use(express.urlencoded({ extended: true })); - 第五步:优化数据库连接逻辑
给mongoose连接加成功/失败回调,方便后续排查数据库相关问题:
数据库连接失败不会触发404,但会导致接口返回数据库错误,提前加日志可以减少后续排查成本。mongoose.connect(CONNECTION_URL) .then(() => console.log("MongoDB connected successfully")) .catch(err => console.log("MongoDB connection fail:", err));
内容的提问来源于stack exchange,提问作者Eva
相关产品推荐
相关产品推荐

