Nodejs中express的mvc结构,可以将router理解为controler吗?

Nodejs中express的mvc结构,可以将router理解为controler吗?

现在的情况是router作为中间件直接被app所use,同时它使用了views,使用了model提供的数据。业务逻辑就顺手放在了router里面。 这样做,合理吗?

8 回复

Node.js 中 Express 的 MVC 结构

背景问题:

在 Node.js 中使用 Express 框架时,有人认为 router 可以等同于 controller。这种理解是否正确?

答案:

在 Express 中,虽然 routercontroller 都负责处理特定的请求和响应,但它们的功能和职责有所不同。router 主要负责路由匹配,而 controller 则更专注于业务逻辑处理。

解释:

  1. Router:

    • router 主要用于定义 URL 路由规则,并将请求分配给相应的处理函数(通常是 controller 函数)。
    • 它更像是一个路由器,而不是控制器。
  2. Controller:

    • controller 负责处理具体的业务逻辑,如数据库操作、数据验证等。
    • 它通常接收来自 router 的请求,并返回响应结果。

示例代码:

假设我们有一个简单的博客应用,我们需要处理用户对文章的增删改查操作。

// models/article.js
const mongoose = require('mongoose');
const articleSchema = new mongoose.Schema({
    title: String,
    content: String,
});

module.exports = mongoose.model('Article', articleSchema);
// controllers/articleController.js
const Article = require('../models/article');

exports.createArticle = async (req, res) => {
    const { title, content } = req.body;
    try {
        const article = await Article.create({ title, content });
        res.status(201).json(article);
    } catch (error) {
        res.status(500).json({ message: 'Error creating article' });
    }
};

exports.getArticles = async (req, res) => {
    try {
        const articles = await Article.find();
        res.status(200).json(articles);
    } catch (error) {
        res.status(500).json({ message: 'Error fetching articles' });
    }
};
// routes/articles.js
const express = require('express');
const router = express.Router();
const articleController = require('../controllers/articleController');

router.post('/', articleController.createArticle);
router.get('/', articleController.getArticles);

module.exports = router;
// app.js
const express = require('express');
const app = express();
const articleRoutes = require('./routes/articles');

app.use(express.json());
app.use('/api/articles', articleRoutes);

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

总结:

  • router 仅负责定义路由和请求分发。
  • controller 负责具体的业务逻辑处理。
  • 将业务逻辑放在 router 中是不合理的,应该将其分离到 controller 中,以便更好地维护和扩展。

这样不太合理的,建议看看这个: https://github.com/madhums/node-express-mongoose-demo

可以,不管什么mvc,都是在router里调用controller里的方法,只是结构设计的不一样,express没有强制你建立controller而已,roueter可以看做spring mvc里的DispatcherServlet,当然也算一个controller只不过不是业务逻辑的controller。

多谢

controller没有必要 组织代码完全可以用目录分级来搞定

业务逻辑简单的话,其实也可以。这都是很灵活的事情,不过最好还是放 controller,以后拓展的时候不用改东西。

在Node.js的Express框架中,MVC(Model-View-Controller)是一种常见的架构模式,用于组织代码并保持良好的分离关注点。虽然Express并没有强制使用MVC架构,但可以通过一些设计原则来实现类似的功能。

背景知识

  1. Model:负责数据逻辑,通常与数据库交互。
  2. View:负责展示逻辑,通常是模板引擎。
  3. Controller:负责处理请求逻辑,将数据从Model传递给View。

Express中的Router

在Express中,Router 是一个强大的工具,用于组织路由和中间件。虽然Router并不是严格意义上的“Controller”,但它确实承担了许多Controller的职责,比如处理请求、调用Model、并将结果发送到View。

示例代码

以下是一个简单的示例,展示了如何在Express中实现MVC结构:

// models/user.js
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
    name: String,
    email: String
});
module.exports = mongoose.model('User', userSchema);
// controllers/userController.js
const User = require('../models/user');

exports.listUsers = async (req, res) => {
    const users = await User.find();
    res.render('users/list', { users });
};

exports.createUser = async (req, res) => {
    const newUser = new User(req.body);
    await newUser.save();
    res.redirect('/users');
};
// routes/users.js
const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');

router.get('/', userController.listUsers);
router.post('/', userController.createUser);

module.exports = router;
// app.js
const express = require('express');
const app = express();
const usersRouter = require('./routes/users');

app.use(express.urlencoded({ extended: true }));
app.use(express.json());

app.set('view engine', 'ejs'); // 使用EJS模板引擎

app.use('/users', usersRouter); // 使用路由

app.listen(3000, () => console.log('Server is running on port 3000'));

解释

  1. Model (models/user.js):定义了用户的Schema,并提供了基本的CRUD操作。
  2. Controller (controllers/userController.js):包含了处理用户列表和创建用户的逻辑。
  3. Router (routes/users.js):定义了用户相关的路由,并将这些路由绑定到相应的Controller方法上。
  4. App (app.js):配置了Express应用,设置了视图引擎,并使用了用户相关的路由。

结论

虽然Express中的Router并不是严格的“Controller”,但在实际开发中,它可以很好地扮演Controller的角色,帮助我们组织代码并保持清晰的结构。

回到顶部