什么是Node.js的Connect,Express和“中间件”?
尽管知道JavaScript很好,但我很困惑Node.js生态系统中的这三个项目究竟做了什么。 它是否像Rails'Rack? 有人可以解释吗?
[ 更新:从4.0版本开始,Express不再使用Connect。 但是,Express仍然与为Connect编写的中间件兼容。 我的原始答案如下。]
我很高兴你问到这个问题,因为对于查看Node.js的人来说,这绝对是一个常见的混乱点。 这是我解释它的最佳镜头:
Node.js本身提供了一个http模块,它的createServer
方法返回一个可以用来响应HTTP请求的对象。 该对象继承了http.Server
原型。
Connect还提供了一个createServer
方法,该方法返回一个继承了http.Server
扩展版本的http.Server
。 Connect的扩展主要是为了让插入中间件很容易。 这就是Connect将自己描述为“中间件框架”的原因,并且常常被类比为Ruby的Rack。
Express将Connect连接到http模块:它提供了一个扩展Connect的Server
原型的createServer
方法。 所以Connect的所有功能都在那里,再加上视图渲染和一个方便描述路由的DSL。 Ruby的Sinatra是一个很好的比喻。
那么还有其他框架可以更进一步并扩展Express! 例如,Zappa集成了对CoffeeScript,服务器端jQuery和测试的支持。
以下是“中间件”含义的具体示例:开箱即用,以上都不是为您提供静态文件。 但是,只需要将connect.static
(Connect附带的一个中间件)放在指向目录的位置,服务器就可以访问该目录中的文件。 请注意,Express也提供Connect的中间件; express.static
与connect.static
相同。 (直到最近,两者都被称为staticProvider
。)
我的印象是,现在大多数“真正”的Node.js应用程序正在使用Express进行开发; 它添加的功能非常有用,如果您需要,所有较低级别的功能仍然存在。
接受的答案是非常老的(现在是错误的)。 以下是基于当前版本的Connect(3.0)/ Express(4.0)的信息(含源代码)。
什么Node.js附带
http / https createServer
, createServer
需要一个回调(req,res),例如
var server = http.createServer(function (request, response) {
// respond
response.write('hello client!');
response.end();
});
server.listen(3000);
什么连接增加
中间件基本上是任何位于应用程序代码和一些低级API之间的软件。 Connect扩展了内置的HTTP服务器功能并增加了一个插件框架。 插件充当中间件,因此连接是一个中间件框架
它的做法很简单(实际上代码非常简短!)。 只要你调用var connect = require('connect'); var app = connect();
var connect = require('connect'); var app = connect();
你会得到一个功能app
,可以:
.use
(来源)管理插件(由于这个简单的代码行来自这里)。 由于1)你可以做到以下几点:
var app = connect();
// Register with http
http.createServer(app)
.listen(3000);
结合2.),你会得到:
var connect = require('connect');
// Create a connect dispatcher
var app = connect()
// register a middleware
.use(function (req, res, next) { next(); });
// Register with http
http.createServer(app)
.listen(3000);
Connect提供了一个实用的函数来注册自己的http
这样你就不需要调用http.createServer(app)
。 它被称为listen
,代码只是创建一个新的http服务器,注册的连接作为回调并将参数转发给http.listen
。 来自源代码
app.listen = function(){
var server = http.createServer(this);
return server.listen.apply(server, arguments);
};
所以,你可以这样做:
var connect = require('connect');
// Create a connect dispatcher and register with http
var app = connect()
.listen(3000);
console.log('server running on port 3000');
它仍然是你的好老的http.createServer
,顶部有一个插件框架。
ExpressJS增加了什么
ExpressJS和连接是并行项目。 Connect只是一个中间件框架,具有很好的use
功能。 Express不依赖于Connect(请参阅package.json)。 然而,它所做的一切连接也就是:
createServer
一样注册到createServer
因为它也只是一个可以占用req
/ res
对(source)的函数。 listen
函数用http注册自己 除了连接提供了什么(它表达重复)之外,它还有许多更多的功能。 例如
中间件是共享的
ExpressJS和连接的use
功能是兼容的,因此中间件是共享的。 两者都是中间件框架,表达的不仅仅是简单的中间件框架。
你应该使用哪一个?
我的意见:你已经足够了解^基于上述^做出自己的选择。
http.createServer
。 http.createServer
之上的一个很好的抽象 大多数人应该只使用ExpressJS。
接受的答案有什么问题
这些在某些时间点可能是正确的,但现在是错误的:
它继承了http.Server的扩展版本
错误。 它没有扩展它,正如你所看到的......使用它
Express将Connect连接到http模块
Express 4.0甚至不依赖于连接。 请参阅当前的package.json依赖项部分
的node.js
Node.js是服务器端的javascript电机。
除了所有js功能之外,它还包括网络功能(如HTTP)和对文件系统的访问。
这与网络任务被浏览器垄断的客户端js不同,出于安全原因禁止访问文件系统。
node.js作为Web服务器:express
一些在服务器上运行的东西可以理解HTTP,并且可以像访问Web服务器一样访问文件。 但它不是一个。
为了使node.js像Web服务器一样工作,必须对其进行编程:处理传入的HTTP请求并提供适当的响应。
这就是Express所做的:它是在js中实现一个web服务器。
因此,实施网站就像配置快速路线,并编程网站的特定功能。
中间件和连接
提供页面涉及许多任务。 这些任务中的许多都是众所周知的并且非常普遍,所以节点的Connect模块(可用于在节点下运行的许多模块之一)实现这些任务。
看到目前令人印象深刻的产品:
Connect是框架,通过它你可以选择你需要的(子)模块。
Contrib中间件页面列举了一长串附加中间件。
Express本身带有最常见的Connect中间件。
该怎么办?
安装node.js.
节点带有npm节点包管理器。
命令npm install -g express
将全球下载并安装express(查看快速指南)。
在命令行中运行express foo
(不在节点中)将创建一个名为foo的可立即运行的应用程序。 切换到(新创建的)目录并使用node <appname>
命令与节点一起运行,然后打开http://localhost:3000
并查看。 现在你进来了。
上一篇: What is Node.js' Connect, Express and "middleware"?
下一篇: What is Node.js?