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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:37:05