中间件实际上如何工作?

我很好奇NodeJS和Express。 中间件如何工作? 我将如何去创build我自己的中间件?

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

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

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

编辑:这篇文章是为Express 3写的。一些细节已经改变,但从概念上说是一样的。

开始之前的一个注意事项:Express构build在Connect之上,它基本上处理它的中间件。 当我在这些例子中写出express时,我可以轻松地写connect

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

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

基本上,你做一个单一的function,处理所有的 HTTP请求。 尝试运行上面的代码,并访问本地主机:1337 /你好本地主机:1337 /哇动漫 。 从技术上讲,这是你真正需要的!

但是,让我们说你想要每一次运行许多function。 也许你想添加一个命令行logging器,也许你想让每个请求纯文本。

 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被调用(或response.send中的response.send )时,我们停止。

如果您有兴趣,我写了一篇博文 ,更详细地解释了Express和中间件 。

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

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

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

如果一个中间件不会调用next()它会返回,所以例如,如果您将中间件提供给更复杂的中间件之前,它将返回静态文件,而不需要调用其他中间件。

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

请参阅来自connect的logging器中间件源代码(页面底部): http : //www.senchalabs.org/connect/logger.html