Node.js'Connect、Express和“中间件”?

尽管我很了解JavaScript,但我不明白完全这三个项目在Node.js生态系统中的作用。是不是有点像《Rails’Rack》?有人能解释一下吗?

151299 次浏览

Connect为常见的HTTP服务器功能(如会话管理、身份验证、日志记录等)提供了“更高级别”的api。Express是建立在具有高级功能(类似Sinatra)的Connect之上的。

[更新:]从4.0版本开始,Express不再使用Connect。但是,Express仍然与为Connect编写的中间件兼容。我的原始答案如下。

我很高兴你问了这个问题,因为对于那些使用Node.js的人来说,这绝对是一个常见的困惑点。下面是我最好的解释:

  • Node.js本身提供了一个http模块,它的createServer方法返回一个你可以用来响应http请求的对象。该对象继承了http.Server原型。

  • Connect还提供了一个createServer方法,该方法返回一个继承了http.Server扩展版本的对象。Connect的扩展主要是为了方便插入中间件。这就是为什么Connect将自己描述为“中间件框架”,并经常被比作Ruby的Rack。

  • Express对Connect的作用是Connect对http模块的作用:它提供了一个扩展Connect的createServer原型的createServer方法。所以Connect的所有功能都在那里, + 视图渲染和一个方便的DSL描述路由。林心如的辛纳屈是一个很好的类比。

  • 还有其他框架甚至更进一步,扩展了Express!Zappa,例如,它集成了对CoffeeScript、服务器端jQuery和测试的支持。

这里有一个关于“中间件”含义的具体例子:开箱即用,上面没有一个为您提供静态文件。但是只要放入connect.static (Connect附带的中间件),配置为指向一个目录,您的服务器将提供对该目录中的文件的访问。注意,Express也提供Connect的中间件;express.staticconnect.static相同。(直到最近,他们都被称为staticProvider。)

我的印象是,现在大多数“真正的”Node.js应用都是用Express开发的;它添加的功能非常有用,如果你想要,所有低级功能仍然存在。

node . js

Node.js是服务器端的javascript马达。
除了js的所有功能外,它还包括网络功能(如HTTP)和对文件系统的访问。
这与客户端js不同,在客户端js中,网络任务由浏览器独占,出于安全原因禁止访问文件系统

Node.js作为web服务器:express

运行在服务器上,理解HTTP并可以访问文件的东西听起来像web服务器。但它不是。
为了使node.js像web服务器一样工作,必须对其进行编程:处理传入的HTTP请求并提供适当的响应。
这就是Express所做的:它是一个用js实现的web服务器。
因此,实现一个网站就像配置快速路由,并编程网站的特定功能

中间件和连接

服务页面涉及许多任务。这些任务中有许多是众所周知且非常常见的,因此node的连接模块(可在node下运行的众多模块之一)实现了这些任务。
查看当前令人印象深刻的产品:

  • 日志记录器请求记录器自定义格式支持
  • csrf跨站请求伪造保护
  • 压缩 Gzip压缩中间件
  • basicAuth基本http认证
  • bodyParser可扩展请求体解析器
  • json应用/json解析器
  • urlencoded应用/x-www-form-urlencoded解析器
  • 多部分多部分/表单数据解析器
  • 超时请求超时
  • cookieParser cookie解析器
  • 会话会话管理支持与捆绑的MemoryStore
  • cookieSession基于cookie的会话支持
  • methodOverride伪HTTP方法支持
  • responseTime计算响应时间并通过x -响应时间曝光
  • static()中间件的staticCache内存缓存层
  • 静态流静态文件服务器支持范围和更多
  • 目录目录列表中间件
  • vhost虚拟主机子域映射中间件
  • 的图标高效图标服务器(默认图标)
  • 限制限制请求体的字节大小
  • 查询自动查询字符串解析器,填充req.query
  • errorHandler灵活的错误处理器
Connect是框架,通过它你可以选择你需要的(子)模块。
Contrib中间件页列举了一长串额外的中间件)

. Express自带最常见的连接中间件

怎么办呢?

< p >安装node . js。
节点带有npm节点包管理器
命令npm install -g express将下载并全局安装express(检查表达指南)。
在命令行中运行express foo(不是在节点中)将创建一个名为foo的准备运行的应用程序。切换到它的(新创建的)目录,使用命令node <appname>在node中运行它,然后打开http://localhost:3000并查看。

公认的答案已经过时了(现在也是错误的)。以下是基于Connect (3.0) / Express(4.0)当前版本的信息(附源代码)。

Node.js自带什么

http / https createServer简单地接受一个回调(req,res)。

var server = http.createServer(function (request, response) {


// respond
response.write('hello client!');
response.end();


});


server.listen(3000);

连接增加了什么

中间件基本上是位于应用程序代码和一些低级API之间的任何软件。Connect扩展了内置的HTTP服务器功能,并添加了一个插件框架。插件充当中间件,因此connect是中间件框架

它的实现方式非常简单(事实上,代码真的很短!)。一旦你调用var connect = require('connect'); var app = connect();,你会得到一个函数app,可以:

  1. 可以处理请求并返回响应。这是因为你基本上得到了这个函数
  2. 有一个成员函数.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。# EYZ4

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是并行项目。Connect是只是中间件框架,带有一个漂亮的use函数。# EYZ2 (# EYZ3)。然而,它做的一切连接,即:

  1. 可以像connect一样注册createServer,因为它也只是一个可以接受req/res对()的函数。
  2. # EYZ0。
  3. 一个实用工具listen函数到用HTTP注册自己

除了connect提供的功能(表示副本)之外,它还有许多其他特性。如。

  1. # EYZ0。
  2. 顶部级别为路由器的动词(get/post等)
  3. 支持应用程序设置

中间件是共享

ExpressJS的而且连接的use函数是兼容的,因此共享中间件。这两个都是中间件框架,express只是有更多的一个简单的中间件框架

你应该使用哪一个?

我的观点是:基于上述,你已经得到了足够的信息来做出自己的选择。

  • 如果你从头开始创建connect / expressjs之类的东西,请使用http.createServer
  • 如果你正在编写中间件,测试协议等,请使用connect,因为它是http.createServer之上的一个很好的抽象
  • 如果你正在编写网站,请使用ExpressJS。

大多数人应该只使用ExpressJS。

公认的答案有什么问题

在某些时候,这些可能是正确的,但现在是错误的:

它继承了http的扩展版本。服务器

错了。它没有延伸,正如你所看到的……# EYZ0

Express对Connect的作用与Connect对http模块的作用相同

Express 4.0甚至不依赖于连接。# EYZ0

Node.js本身提供了一个HTTP模块,它的createServer方法返回一个可以用来响应HTTP请求的对象。该对象继承了http.Server原型。

相关信息,特别是如果您正在使用NTVS与Visual Studio IDE一起工作。NTVS将NodeJS和Express工具,脚手架,项目模板添加到Visual Studio 2012, 2013。

此外,将ExpressJS或Connect作为“WebServer”调用的措辞是不正确的。您可以使用或不使用它们来创建一个基本的WebServer。一个基本的NodeJS程序也可以使用http模块来处理http请求,从而成为一个基本的web服务器。

愚蠢的简单答案

Connect和Express是nodejs的web服务器。与Apache和IIS不同,它们都可以使用相同的模块,称为“中间件”。

中间件,顾名思义,实际上中间件位于中间。什么中间?请求和响应的中间。如何请求,响应,快递服务器坐在快递应用程序 在这张图中,你可以看到请求来自客户端,然后快速服务器服务器服务这些请求。那么让我们深入挖掘…实际上,我们可以像这样将整个快速服务器的整个任务划分为小的独立任务。 中间件如何位于请求和响应之间小块服务器部件做一些特定的任务和传递请求到下一个。最后对所做的所有任务做出了响应。 所有中间件都可以访问请求对象、响应对象和请求响应周期的下一个函数

这是一个在YouTube视频中间件中解释中间件的好例子