我对NodeJS和Express感到好奇。中间件如何实际工作?我将如何创建自己的中间件?
它依赖于一种依赖注入吗?据我所知,按照您希望执行的顺序添加中间件,并将HTTP请求/响应传递给中间件,然后传递给下一个,接下来,直到其中一个返回/呈现请求/响应。 / p>
请求和响应对象是否通过引用传递给每个中间件?
对不起,如果这听起来很混乱。我正在尝试学习如何创建自己的中间件以便更好地理解它。
答案 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