【问题标题】:How Does Middleware Actually Work? [closed]中间件实际上是如何工作的? [关闭]
【发布时间】:2014-02-24 09:54:49
【问题描述】:

我对 NodeJS 和 Express 很好奇。中间件实际上是如何工作的?我将如何创建自己的中间件?

它是否依赖于一种依赖注入?据我了解,您按照希望执行的顺序添加中间件,HTTP 请求/响应将被传递给中间件,然后传递到下一个,然后是下一个,直到其中一个返回/呈现请求/响应。

请求和响应对象是否通过引用传递通过每个中间件?

对不起,如果这听起来令人困惑。我正在尝试学习如何创建自己的中间件,以便更好地理解它。

【问题讨论】:

  • 您最好寻找一个论坛或其他一些主持讨论的网站。 Stack Overflow 不是用来提出开放式问题,而是针对您所面临的问题提出具体问题,这些问题通常应该能够通过单一响应解决,而无需来回对话。
  • 简单来说,中间件就是处理请求的函数。当您使用 Node 创建 HTTP 服务器时,它可以有一堆与之关联的中间件。当一个请求进来时,它被传递给第一个中间件函数,以及一个包装好的 ServerResponse 对象和一个 next() 回调。每个中间件可以决定通过调用响应对象上的方法来响应,和/或通过调用next() 将请求传递到堆栈中的下一层。

标签: node.js express


【解决方案1】:

编辑:这篇文章是为 Express 3 写的。从那时起,小细节发生了变化,但在概念上是相同的。

开始之前的注意事项:Express 构建在 Connect 之上,它基本上处理了它的中间件。当我在这些示例中写express 时,我同样可以轻松地写connect

在底层,你有 Node 的 HTTP 服务器模块。它看起来像这样:

var http = require("http");
http.createServer(function(request, response) {
  response.end("Hello world!\n");
}).listen(1337, "localhost");

基本上,您创建一个处理所有 HTTP 请求的单个 函数。尝试运行上述代码并访问 localhost:1337/hellolocalhost:1337/wow-anime。从技术上讲,这就是你真正需要的!

但是假设您希望许多函数每次都运行。也许你想添加一个命令行记录器,也许你想让每个请求都变成纯文本。

var http = require("http");
http.createServer(function(request, response) {

  // logger
  console.log("In comes a " + request.method + " to " + request.url);

  // plain text
  response.writeHead(200, { "Content-Type": "text/plain" });

  // send response      
  response.end("Hello world!\n");

}).listen(1337, "localhost");

在 Express/Connect 中,您可以改为这样写:

var express = require("express");
var app = express();
app.use(express.logger());
app.use(function(request, response, next) {
  response.writeHead(200, { "Content-Type": "text/plain" });
  next();
});
app.use(function(request, response) {
  response.end("Hello world!\n");
});
app.listen(1337);

我认为中间件是一个函数列表。当一个 HTTP 请求进来时,我们从顶部开始,从上到下遍历每个中间件,并在调用 response.end(或 Express 中的 response.send)时停止。

如果你有兴趣,我写了更详细的a blog post that explains Express and middleware

【讨论】:

  • 优秀的埃文!完美回应。
【解决方案2】:

是的,对象总是在 Javascript 中通过引用传递。

所以基本上请求和响应对象被传递给第一个中间件,它为所欲为,如果它想要请求对象,然后调用next()触发下一个中间件,它传递请求和响应对象.

当所有中间件都返回后,服务器会发回响应。 (可以先手动发送。)

如果中间件不调用 next() 它会返回,例如,如果您将服务静态文件的中间件放在更复杂的中间件之前,它将返回静态文件而无需调用其他中间件。

您的请求处理程序app.get('/index', function(req, res) { /* whatever you want */ }); 本身就是一个中间件。

例如查看来自连接的记录器中间件的来源(页面底部):http://www.senchalabs.org/connect/logger.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2021-01-21
    相关资源
    最近更新 更多