控制器和中间件有什么区别?

20

我正在用express.js编写API。我最初编写的API仅使用路由和原始的SQL查询。现在,我已经将大部分API重写为使用ORM来处理模型和迁移。

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

我不理解控制器的用例。如果它符合适当的编程惯例,我不想从我的API中省略它。

2个回答

25

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

下面是一个示例,其中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);

1
我明白了,这解释了很多事情。 - delavago1999
“控制器”不是Node/Express的一级组件。如果定义为这样的项目工件,则它们是项目工件。请注意,下一个响应。 - MoMo

9
如果您在谈论node/express术语,那么中间件只是路由函数/方法(get,set,delete,use等)使用的回调函数。 回调函数可以将响应发送或不发送给客户端。 如果愿意,回调函数确实是“控制器”(例如:ASP.NET Core MVC),但这取决于您。以下是来自 Express 的引用。请注意术语“中间件”的用法,以及没有提到“控制器”的地方。

Middleware函数是具有访问请求对象(req),响应对象(res)和应用程序的下一个中间件函数的函数。下一个中间件函数通常由名为next的变量表示。

Middleware函数可以执行以下任务:

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

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

  • 应用程序级别的中间件
  • 路由器级别的中间件
  • 错误处理中间件
  • 内置中间件第三方中间件

这里是Mozilla的另一篇很好的文章,其中提到了一些控制器/回调函数示例。

除此之外,您可以在团队中定义“控制器”的含义,并从那里遵循命名约定。 关键是您的SOLID配置文件以及如何分离关注点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接