什么是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.staticconnect.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 ,可以:

  1. 可以处理请求并返回响应。 这是因为你基本上得到这个function
  2. 有一个成员函数。 .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 只是一个中间件框架,具有很好的usefunction。 Express不依赖于Connect ( 请参阅package.json )。 然而,它所做的一切连接,即:

  1. 可以像createServer一样注册到createServer因为它也只是一个可以占用req / res对( source )的函数。
  2. 使用函数来注册中间件 。
  3. 一个实用程序listenfunction用http注册自己

除了提供了什么连接(表示重复)之外,它还具有许多更多function。 例如

  1. 有查看引擎支持 。
  2. 具有顶级动词(get / post等)为其路由器 。
  3. 有应用程序设置支持。

中间件是共享的

ExpressJS Connect的usefunction是兼容的,因此中间件是共享的 。 两者都是中间件框架,表示只不过是一个简单的中间件框架

你应该使用哪一个?

我的意见:你已经足够的知情^基于上面^做出自己的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不同,它们可以使用相同的模块,称为“中间件”。