中间件如何实际工作?

时间:2014-01-31 16:05:27

标签: node.js express

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

它依赖于一种依赖注入吗?据我所知,按照您希望执行的顺序添加中间件,并将HTTP请求/响应传递给中间件,然后传递给下一个,接下来,直到其中一个返回/呈现请求/响应。 / p>

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

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

2 个答案:

答案 0 :(得分:3)

编辑:这篇文章是为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 / hello localhost: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

答案 1 :(得分:0)

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

所以基本上将请求和响应对象传递给第一个中间件,它做任何它想要的,如果需要请求对象,然后调用next()来触发下一个中间件,传递请求和响应对象。

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

如果中间件没有调用next()它会返回,例如,如果你把中间件提供给更复杂的静态文件,它将返回静态文件而不需要调用其他中间件。 / p>

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

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