控制器和中间件有啥区别

Posted

技术标签:

【中文标题】控制器和中间件有啥区别【英文标题】:Whats the difference between a Controller and a Middleware控制器和中间件有什么区别 【发布时间】:2019-12-08 00:16:19 【问题描述】:

我正在 express.js 中编写 API。我编写的原始 API 只使用了路由和原始 SQL 查询。从那以后,我现在使用 ORM 重写了大部分 API 来响应模型和迁移。

我的问题是中间件和控制器有什么区别和用例。目前只使用中间件,因为大多数在线资源只解释中间件是什么。

我不了解控制器的用例。如果它在适当的编程约定中使用,我不想从我的 API 中省略它

【问题讨论】:

【参考方案1】:

您应该将中间件视为 API 中的一个步骤,而将控制器视为实际响应请求的实体。

Bellow 是一个示例,其中authenticationMiddleware 是一个中间件,因为它是处理过程中的一个步骤,但不应返回响应。不过可以,以防出错。

然后getItems 实际处理特定于此调用的逻辑。

根据经验,中间件经常被重复使用不止一次,而且它们通常没有响应。相反,控制器响应并且大部分时间特定于一个端点。

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

function authenticationMiddleware(req, res, next) 
  // Check that the user is authenticated using req.headers.Authorization
  // for example

  if (authenticated) 
    // The user is authenticated, we can go to the next step
    next();

   else 
    // The user is not authenticated, we stop here
    res.status(401);
    res.send("Error during authentication");
  


function getItems(req, res, next) 
  // Here we focus on the actual response, we assume that the user is authenticated
  res.send( items: [] );


app.get("/items", authenticationMiddleware, getItems);
app.post("/items", authenticationMiddleware, createItems); // Re-use the same middleware

app.listen(3000);

【讨论】:

我明白了。这澄清了很多事情 “控制器”不是 node/express 的一阶组件。如果这样定义,它们就是项目工件。注意,下一个回复。【参考方案2】:

如果您指的是节点/express 术语,middleware 只是路由功能/方法(获取、设置、删除、使用、等等)。回调可以发送或不发送响应给客户端。 回调实际上是'控制器',如果你想这样称呼它们(例如:ASP.NET Core MVC),但这取决于你。以下是来自Express 的引用。请注意术语“中间件”以及没有提及“控制器”的地方。

中间件函数是可以访问请求对象 (req)、响应对象 (res) 和下一个中间件的函数 在应用程序的请求-响应周期中起作用。下一个 中间件函数通常由名为 next 的变量表示。

中间件函数可以执行以下任务:

执行任何代码。 更改请求和响应对象。 结束请求-响应周期。 调用堆栈中的下一个中间件函数。

'Express' 还定义了不同类型的有用的中间件:

应用级中间件 路由器级中间件 错误处理中间件 内置中间件第三方中间件

Here's 来自 Mozilla 的 pov 的另一个不错的看法,其中确实提到了一些 controller/callback 示例。

除此之外,您还可以定义团队中的“控制器”是什么,并从那里遵循命名约定。关键是您的SOLID 个人资料以及您如何区分关注点。

【讨论】:

以上是关于控制器和中间件有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

ruby on rails 中的控制器和动作有啥区别?

路由器和带注释的控制器有啥区别?

弹出视图控制器、关闭视图控制器和使用展开转场有啥区别?

iOS中视图控制器生命周期和视图生命周期有啥区别?

JMeter:线程组中的循环计数和逻辑控制器中的循环控制器有啥区别

conda 包版本控制的“=”和“==”有啥区别?