为何 Nodejs 的 expressjs 默认不支持 controller action 这种常见的开发方式?

为何 Nodejs 的 expressjs 默认不支持 controller action 这种常见的开发方式?

为何 expressjs 默认不支持 controller action 这种常见的开发方式? 写了controller action之后,还需要去routes写很多路由,如下 app.get(’/login’, users.login) app.get(’/logout’, users.logout) …

这种设计方式 缺点:麻烦 优点:url配置更加灵活

还有其他什么优点呢?

6 回复

为何 Node.js 的 ExpressJS 默认不支持 Controller Action 这种常见的开发方式?

为什么 ExpressJS 不默认支持 Controller Action?

ExpressJS 是一个轻量级的框架,它遵循“最小化原则”(Principle of least surprise),这意味着它只提供最核心的功能。Controller Action 模式是一种常见的软件架构模式,它将请求处理逻辑封装在控制器类中,并通过动作方法来响应不同的HTTP请求。

然而,在 ExpressJS 中,默认情况下并没有内置这种模式。这是因为:

  1. 灵活性:ExpressJS 提供了极大的灵活性,允许开发者自由地组织代码结构。你可以根据自己的需求选择是否使用 Controller Action 模式。
  2. 简洁性:ExpressJS 本身的设计目标就是简洁和高效。通过直接在路由中定义处理函数,可以避免引入额外的抽象层,从而减少代码复杂度。

示例代码

假设你有一个简单的用户登录和登出功能,如果不使用 Controller Action 模式,你的代码可能看起来像这样:

const express = require('express');
const app = express();

// 用户登录处理函数
function login(req, res) {
    // 登录逻辑
    res.send("Login successful");
}

// 用户登出处理函数
function logout(req, res) {
    // 登出逻辑
    res.send("Logout successful");
}

// 路由配置
app.get('/login', login);
app.get('/logout', logout);

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

缺点与优点

缺点

  • 需要在路由文件中重复定义每个请求处理函数。
  • 当应用变得复杂时,路由文件可能会变得庞大且难以维护。

优点

  • 灵活性:你可以自由地将处理函数组织在任何地方,包括模块、类等。
  • 简单性:对于小型项目,这种方式更直接,不需要引入额外的抽象层。

其他优点

  1. 可扩展性:ExpressJS 的设计使得你可以轻松地扩展功能,比如通过中间件或自定义路由处理逻辑。
  2. 社区支持:由于 ExpressJS 的广泛使用,有大量的第三方库和工具可以帮助你实现 Controller Action 模式,例如 express-controllerexpress-generator

总之,虽然 ExpressJS 默认不支持 Controller Action 模式,但其灵活性和简洁性使其成为一种强大而高效的框架。如果你需要这种模式,可以通过编写自定义的中间件或使用第三方库来实现。


个人感觉,这样简单,灵活,轻量…

再说了,expressjs 不是mvc 框架…你提的这个问题…没提到点上…

你需要controller action 的模式,可以参考一些基于express 的mvc

Monorail.js – Ultra lightweight MVC framework for Node.js Locomotive – Powerful MVC framework for Node.js. Inspired by Ruby on Rails. CompoundJS – High-level MVC framework inspired by RoR

express的路由处理(app.router)是根据url来映射出controller和action的,提供一个简洁,灵活的高性能工具,提供丰富的api和中间件全局的处理,这个和mvc框架还是有点区别

我觉得 express这种通过url映射controller的方式和java的spring mvc3.x的思路是一样的,这种方式能够提供灵活的处理方式 action的方式类似于struts。

java领域里这两种方式也是存在争议,设计思路不一样不能说那种不好,不过我感觉通过路由控制更灵活也更贴近RESTful

Express.js 是一个轻量级的 Web 框架,它默认不内置控制器(Controller)的概念。这是因为 Express.js 旨在提供最小化的核心功能,使得开发者可以根据自己的需求来组织代码结构。虽然默认情况下没有内置 Controller 的概念,但这并不意味着不能使用 Controller 来管理逻辑。

为什么 Express.js 不内置 Controller?

  1. 灵活性:Express.js 的设计理念是灵活且可扩展的。开发者可以自由选择如何组织代码结构。
  2. 最小化核心功能:内置 Controller 可能会增加不必要的复杂性,对于简单的应用来说可能会显得多余。

示例代码

尽管 Express.js 不内置 Controller,但你可以自己实现类似的功能。以下是一个简单的示例:

// 定义控制器
const userController = {
    login: (req, res) => {
        res.send('Login');
    },
    logout: (req, res) => {
        res.send('Logout');
    }
};

// 在路由中使用控制器
const express = require('express');
const app = express();

app.get('/login', userController.login);
app.get('/logout', userController.logout);

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

优点

  • 模块化:将业务逻辑放在控制器中,可以更好地组织代码。
  • 可维护性:分离关注点,使得代码更容易维护和测试。
  • 复用性:控制器中的逻辑可以被多个路由复用。

缺点

  • 配置繁琐:需要手动将路由映射到控制器方法上。
  • 灵活性降低:虽然减少了配置的繁琐,但一定程度上也牺牲了 URL 配置的灵活性。

总结

虽然 Express.js 没有内置 Controller,但通过上述方式可以轻松实现类似的逻辑分离,从而提升代码的可维护性和复用性。

回到顶部