MVC架构拆分后Express请求无法处理问题求助
问题:拆分Express+Mongoose为MVC架构后请求无响应(无报错)
原本可正常运行的单文件Express+Mongoose代码,拆分为MVC架构后,发起请求时无任何报错,但请求完全无法得到处理。此前单文件版本运行正常,相关代码如下:
index.js(主文件)
const express = require("express"); const app =express(); const {connectMongoose} = require("./connection.js"); connectMongoose("mongodb://localhost:27017/").then(console.log("MongoDbConnected Successfully")); const { logReqRes } = require("./middlewares/index"); // logReqRes(); const router = require("./routes/user.js"); const PORT = 8000; //middlwares app.use(express.urlencoded({extends : false})); app.use(logReqRes('./log.txt')); //routes app.use("/user",router); app.listen(PORT,()=>{console.log("server started",PORT)});
connection.js
const mongoose = require("mongoose"); async function connectMongoose(url){ console.log("connection starts"); return mongoose.connect((url)); } module.exports = {connectMongoose};
routes/user.js
const express = require("express"); const router = express.Router(); const {handleGetAllUsers,handleGetUserById,handleUpdateUserByID,handledeleteUserById} = require("../controllers/user"); console.log("router.req=>",router.req); router.route("/").get(()=>handleGetAllUsers); router.route("/:id").delete(()=>handledeleteUserById).patch(()=>handleUpdateUserByID).get(()=>handleGetUserById); module.exports = router;
controllers/user.js
const { model } = require("mongoose"); const user_mongoose = require("../models/user") async function handleGetAllUsers(req,res){ const user = await user_mongoose.find({}); res.json(user); } async function handleGetUserById(req,res){ console.log("getalluser starts"); var user = await user_mongoose.findById(req.params.id); return res.json(user); } async function handleUpdateUserByID(req,res){ var user = await user_mongoose.findByIdAndUpdate(req.params.id,{first_name:"Yashit Jain"}) ; res.send(await user_mongoose.findById(req.params.id)); } async function handledeleteUserById(req,res){ const userId = req.params.id; // take id to number const user = await user_mongoose.findByIdAndDelete(userId); res.send(user); } model.exports={ handleGetAllUsers, handleGetUserById, handleUpdateUserByID, handledeleteUserById, }
models/user.js
const mongoose = require("mongoose") //schema const userSchema = new mongoose.Schema({ first_name : { type:String, require : true }, last_name : { type:String, }, email : { type : String, require : true, unique : true }, gender : { type : String, require : true }, title : { type : String, } },{timestamps:true}) //model const user_mongoose = mongoose.model("user",userSchema); module.exports = user_mongoose;
问题排查与修正
1. 路由回调函数写法错误
routes/user.js中,你用箭头函数包裹控制器函数但未执行,也未传递req/res参数,导致请求进来后没有触发实际逻辑:
// 错误写法 router.route("/").get(()=>handleGetAllUsers); // 正确写法:直接传入函数引用 router.route("/").get(handleGetAllUsers);
同理,/user/:id下的delete/patch/get路由都需要修正为直接传入控制器函数。
2. 控制器文件导出语法错误
controllers/user.js中,导出语句写成了model.exports,正确应为module.exports,否则路由无法正确导入控制器函数:
// 错误写法 model.exports={...} // 正确写法 module.exports={...}
3. Mongoose连接回调逻辑错误
index.js中,then回调直接执行console.log,会导致无论连接成功与否都会打印提示,且未捕获连接错误:
// 错误写法 connectMongoose("mongodb://localhost:27017/").then(console.log("MongoDbConnected Successfully")); // 正确写法 connectMongoose("mongodb://localhost:27017/") .then(() => console.log("MongoDbConnected Successfully")) .catch(err => console.error("MongoDB连接失败:", err));
额外优化(可选)
handleUpdateUserByID中,findByIdAndUpdate默认返回更新前的文档,添加{new: true}可直接返回更新后的文档:
var user = await user_mongoose.findByIdAndUpdate(req.params.id,{first_name:"Yashit Jain"}, {new: true}) ; res.send(user);
内容的提问来源于stack exchange,提问作者jainyashit
相关产品推荐
相关产品推荐

