什么是Node.js的Connect,Express和“中间件”?
尽pipe知道JavaScript非常好,但我很困惑Node.js生态系统中的这三个项目究竟做了什么。 这是像Rails的机架吗? 有人可以解释吗?
[ 更新:从4.0版本开始,Express不再使用Connect。 但是,Express仍然与为Connect编写的中间件兼容。 我的原始答案如下。]
我很高兴你问到这个问题,因为对于查看Node.js的人来说,这绝对是一个常见的混乱点。 这是我最好的解释:
-
Node.js本身提供了一个http模块,它的
createServer
方法返回一个可以用来响应HTTP请求的对象。 该对象inheritance了http.Server
原型。 -
Connect还提供了一个
createServer
方法,该方法返回一个inheritance了http.Server
扩展版本的http.Server
。 连接的扩展主要是为了使插入中间件很容易。 这就是为什么Connect将自己描述为“中间件框架”的原因,并且经常被类比为Ruby的Rack。 -
Express将Connect连接到http模块:它提供了一个扩展Connect的
Server
原型的createServer
方法。 所以Connect的所有function都在那里, 再加上视图渲染和一个方便描述路由的DSL。 Ruby的Sinatra是一个很好的比喻。 -
然后还有其他框架更进一步,并延伸快递! Zappa ,例如,它集成了对CoffeeScript,服务器端jQuery和testing的支持。
以下是“中间件”含义的具体示例:开箱即用,以上都不是为您提供静态文件。 但是只要connect.static
(一个Connect的中间件),configuration为指向一个目录,服务器将提供对该目录中文件的访问。 请注意,Express也提供Connect的中间件; express.static
和connect.static
。 (直到最近都被称为staticProvider
。)
我的印象是,现在大多数“真正”的Node.js应用程序正在用Express来开发。 它添加的function是非常有用的,所有的低级function仍然存在,如果你想要它。
接受的答案是真的老了(现在错了)。 以下是基于当前版本的Connect(3.0)/ Express(4.0)的信息(含源代码)。
什么Node.js来
HTTP / HTTPS的服务器, createServer
需要一个callback(REQ,RES),例如
var server = http.createServer(function (request, response) { // respond response.write('hello client!'); response.end(); }); server.listen(3000);
什么连接添加
中间件基本上是位于应用程序代码和一些低级API之间的任何软件。 Connect扩展了内置的HTTP服务器function并添加了一个插件框架。 插件作为中间件,因此连接是一个中间件框架
它的方式非常简单( 实际上代码非常短 )。 只要你调用var connect = require('connect'); var app = connect();
var connect = require('connect'); var app = connect();
你得到一个function的app
,可以:
- 可以处理请求并返回响应。 这是因为你基本上得到这个function
- 有一个成员函数。
.use
( 源 )pipe理插件 (因为这个简单的代码 就来自这里 )。
由于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
,代码只是创build一个新的http服务器,注册的连接作为callback,并将参数转发给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
function。 Express不依赖于Connect ( 请参阅package.json )。 然而,它所做的一切连接,即:
- 可以像
createServer
一样注册到createServer
因为它也只是一个可以占用req
/res
对( source )的函数。 - 使用函数来注册中间件 。
- 一个实用程序
listen
function用http注册自己
除了提供了什么连接(表示重复)之外,它还具有许多更多function。 例如
- 有查看引擎支持 。
- 具有顶级动词(get / post等)为其路由器 。
- 有应用程序设置支持。
中间件是共享的
ExpressJS 和 Connect的use
function是兼容的,因此中间件是共享的 。 两者都是中间件框架,表示只不过是一个简单的中间件框架 。
你应该使用哪一个?
我的意见:你已经足够的知情^基于上面^做出自己的select。
- 如果你是从头开始创build类似connect /
http.createServer
话,请使用http.createServer
。 - 使用连接,如果你正在编写中间件,testing协议等,因为它是一个很好的抽象顶部
http.createServer
- 如果您正在创作网站,请使用ExpressJS。
大多数人应该只使用ExpressJS。
接受的答案有什么问题
这些在某些时候可能是正确的,但现在是错误的:
它inheritance了http.Server的扩展版本
错误。 它不会扩展它,正如你所看到的… 使用它
Express可以将Connect连接到http模块
Express 4.0甚至不依赖于连接。 请参阅当前的package.json依赖项部分
的node.js
Node.js是服务器端的javascript电机。
除了所有的jsfunction,它还包括networkingfunction(如HTTP)和对文件系统的访问。
这与networking任务被浏览器垄断的客户端js不同,出于安全原因禁止访问文件系统。
node.js作为web服务器:express
在服务器上运行的东西可以理解HTTP,并且可以像访问Web服务器一样访问文件。 但它不是一个。
要使node.js像Web服务器一样运行,必须对其进行编程:处理传入的HTTP请求并提供相应的响应。
这就是Express所做的:它是在js中实现一个web服务器。
因此,实施一个网站就像configuration快速路线,并编程网站的具体function。
中间件和连接
提供页面涉及许多任务。 其中的许多任务是众所周知的,而且非常普遍,所以节点的连接模块(可用于在节点下运行的许多模块之一)实现了这些任务。
看到目前令人印象深刻的产品:
- logging器请求logging器与自定义格式支持
- csrf跨站请求伪造保护
- 压缩 Gzip压缩中间件
- basicAuth基本的httpauthentication
- bodyParser可扩展的请求体parsing器
- json应用程序/ jsonparsing器
- urlencoded应用程序/ x-www-form-urlencodedparsing器
- 多部分多部分/表单数据parsing器
- 超时请求超时
- cookieParsercookiesparsing器
- 会话会话pipe理支持与捆绑的MemoryStore
- cookieSession基于cookie的会话支持
- methodOverride人工 HTTP方法支持
- responseTime计算响应时间并通过X-Response-Time公开
- static()中间件的静态caching内存caching层
- 静态stream式静态文件服务器支持Range等
- 目录目录列出中间件
- 虚拟主机子域映射中间件
- favicon高效favicon服务器(带默认图标)
- 限制请求体的字节数
- 查询自动查询stringparsing器,填充req.query
- errorHandler灵活的error handling程序
连接是框架,通过它你可以select你需要的(子)模块。
Contrib中间件页面列举了一大串附加的中间件 。
Express本身带有最常见的Connect中间件。
该怎么办?
安装node.js.
节点带有npm 节点包pipe理器 。
命令npm install -g express
将全球下载并安装express(查看快速指南 )。
在命令行中运行express foo
(不在节点中)将创build一个名为foo的可立即运行的应用程序。 更改为(新创build的)目录,并使用node <appname>
命令与节点一起运行,然后打开http://localhost:3000
并查看。 现在你在。
Connect为常见的HTTP服务器function(如会话pipe理,身份validation,日志logging等)提供“更高级别”的API。 Express是build立在连接高级(Sinatra like)function之上的。
Node.js
本身提供了一个HTTP模块,它的createServer方法返回一个可以用来响应HTTP请求的对象。 该对象inheritance了http.Server
原型。
相关信息,尤其是如果您使用NTVS与Visual Studio IDE一起工作。 NTVS在Visual Studio 2012,2013中增加了NodeJS和Express工具,脚手架,项目模板。
此外,将ExpressJS或Connect作为“WebServer”调用的语言不正确。 您可以使用或不使用它们来创build基本的WebServer。 一个基本的NodeJS程序也可以使用http模块来处理http请求,从而成为一个基本的Web服务器。
愚蠢的简单的答案
Connect和Express是nodejs的Web服务器。 与Apache和IIS不同,它们可以使用相同的模块,称为“中间件”。