什么是Node.js的Connect,Express和“中间件”?


634

尽管非常了解JavaScript,但我对Node.js生态系统中的这三个项目的确切用途感到困惑。像Rails的架子吗?有人可以解释一下吗?


1
我还没有使用过connect,但是此页面的确使它听起来类似于Rails的Rack。您是否了解Node上下文之外的中间件?
马特·鲍尔,

老实说,没有我想要的那么多。据我所知,是应用层完成所有诸如路由,gzip,标头,cookies之类的应用前程序的工作。我对吗?那么,它是否以某种方式工作,而不是在MVC框架内部(例如Rails),而是在中间件中,路由到适当的MVC控制器/动作?
直到


8
这将清除您所有的疑问和答案,还有更多疑问,我知道这为时已晚(希望有人向下滚动...),但是阅读以下博客文章将清除您对Connect,Express和Middleware的所有疑问。它还会教您一些有关Node.js的知识。http://evanhahn.com/understanding-express/
DotNetInfo

@DiegoCaxito您的链接已断开。
桅杆

Answers:


891

[ 更新:从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对http模块所做的连接:它提供了createServer一种扩展Connect Server原型的方法。因此,这里提供了Connect的所有功能,以及视图渲染和用于描述路线的便捷DSL。Ruby的Sinatra是一个很好的类比。

  • 然后还有其他框架可以扩展Express!例如Zappa,它集成了对CoffeeScript,服务器端jQuery和测试的支持。

这是“中间件”含义的具体示例:开箱即用,以上都不为您提供静态文件。但是只需connect.static插入(Connect附带的中间件),将其配置为指向目录,您的服务器即可提供对该目录中文件的访问。请注意,Express还提供了Connect的中间件。express.static与相同connect.static。(两者都被称为staticProvider直到最近。)

我的印象是,如今,大多数“真正的” Node.js应用都是使用Express开发的。它添加的功能非常有用,并且如果需要,所有较低级别的功能仍然存在。


130
让Connect感到困扰的一件事是它的文档似乎没有承认Node不仅仅是HTTP服务器。“连接是一个Node.js的中间件框架” -不,“连接是的Node.js的HTTP服务器中间件框架”
纤薄

46
@slim我认为您对此有太多了解。Connect的创造者是杰出的Node开发者;他们很清楚Node不仅仅是一个HTTP服务器。但它确实内置的HTTP服务器和Connect是一个中间件框架,你可以在你的Node.js应用程序中使用。
特雷弗·伯纳姆

22
哦,我敢肯定,Connect的制造商已经充分意识到了这一点。如果没有对Node的透彻了解,他们将无法实现自己的目标。但是对于Node的新手来说,单词的选择令人困惑。并连接到新用户。
苗条

10
清晰明了,所有答案都应努力做到。出色的工作特雷弗。
Mark Essel

6
很好的解释。这样的答案有助于将新人们带入Node.js生态系统。对于熟悉在Node.js中开发Web应用程序的人们来说,Express是一个起点。继续Ruby的类比,Express可与Sinatra相提并论。为Ajax客户端应用程序创建JSON API尤其有用。我发现的一件事是,一旦应用程序达到一定程度的复杂性,就需要另一层更像Rails一样。我正在为此目的开发机车,它在Express的基础上进一步发展。
贾里德·汉森

159

公认的答案确实很旧(现在是错误的)。这是基于当前版本的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. 有一个成员函数.usesource)来管理插件(由于这行简单的代码从此处来自)。

由于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是并行项目。Connect 只是一个具有良好use功能的中间件框架。Express不依赖于Connect请参阅package.json)。但是,它所做的一切连接都可以做到:

  1. 可以createServer像connect 这样注册,因为它也是可以带req/ res对()的功能。
  2. 一个使用功能进行注册的中间件
  3. 一个实用程序listen功能,用于向http注册

除了connect提供的功能(表示重复的功能)外,它还有很多其他功能。例如

  1. 视图引擎支持
  2. 具有路由器的顶级动词(获取/发布等)
  3. 具有应用程序设置支持。

中间件是共享的

useExpressJS connect 的功能兼容,因此可以共享中间件。两者都是中间件框架,表达不仅仅是一个简单的中间件框架

您应该使用哪一个?

我的看法:基于以上情况^您已获得足够的信息,可以做出自己的选择。

  • 使用http.createServer如果要创建像从头连接/ expressjs。
  • 如果您正在编写中间件,测试协议等,请使用connect,因为它是基于NET的很好的抽象 http.createServer
  • 如果要编写网站,请使用ExpressJS。

大多数人应该只使用ExpressJS。

被接受的答案有什么问题

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

继承了http.Server的扩展版本

错误。它不会扩展它,如您所见...正在使用它

Express可以进行连接,而Connect可以完成对http模块的连接

Express 4.0甚至不依赖于连接。请参阅当前的package.json依赖项部分


您说让您能够处理请求并返回响应,但是人们说Express确实是Web服务器...我很困惑。是否不会将响应发送回需要Web服务器功能(如Express)?
PositiveGuy

1
好东西,谢谢!非常有帮助...尤其是不知道连接确实是提供路由的真正原因,而表达只是继承了它,它不是路由的唯一/源提供者。最后的用例很有用,因为我认为我必须使用connect AND express,但实际上您需要使用的所有内容都是针对Web应用程序的Express,因此这为我清除了很多麻烦。您不会同时安装两者,而是同时安装其中之一!
PositiveGuy

您的答案应该放在首位。当我阅读接受的答案时,我投票了。但是在看完答案之后... naahhh
Arun Joshla

67

node.js

Node.js是服务器端的JavaScript引擎。
除了所有js功能之外,它还包括联网功能(例如HTTP)和对文件系统的访问。
这与客户端js不同,在客户端js中,网络任务由浏览器垄断,并且出于安全原因,禁止访问文件系统。

作为网络服务器的nod​​e.js:表达

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

中间件和连接

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

  • 具有自定义格式支持的记录器请求记录器
  • csrf 跨站点请求伪造保护
  • 压缩 Gzip压缩中间件
  • basicAuth 基本的http认证
  • bodyParser 可扩展请求正文解析器
  • json 应用程序/ json解析器
  • urlencoded 应用程序/ x-www-form-urlencoded解析器
  • 部分部分/表单数据解析器
  • 超时 请求超时
  • cookieParser cookie解析器
  • 捆绑的MemoryStore支持会话会话管理
  • cookieSession 基于cookie的会话支持
  • methodOverride伪造的 HTTP方法支持
  • responseTime 计算响应时间并通过X-Response-Time公开
  • static()中间件的staticCache内存缓存层
  • 静态 流静态文件服务器,支持Range等
  • 目录 目录列表中间件
  • vhost 虚拟主机子域映射中间件
  • Favicon 高效的Favicon服务器(带有默认图标)
  • 限制 请求主体的字节大小
  • 查询 自动查询字符串解析器,填充req.query
  • errorHandler 灵活的错误处理程序

Connect是框架,通过它可以选择所需的(子)模块。
Contrib中间件”页面列举了一长串其他中间件
Express本身具有最常见的Connect中间件。

该怎么办?

安装node.js。
节点自带NPM,该节点包管理器
该命令npm install -g express将在全球范围内下载并安装Express(请参阅Express Guide)。
运行express foo在命令行(而不是在节点)将创建一个随时可以运行的应用程序名为foo。切换到其(新创建的)目录,并使用node使用node运行它node <appname>,然后打开http://localhost:3000并查看。现在你在。


3
非常感谢。这是每篇博客文章都会错过的一种简单的废话,这种简单的设置可以是??? 如果您从未做过。是的,当您完成后很简单,但是您不知道如何第一次开始!当开发人员在博客文章中忽略它时,这是必不可少的。我不想找到另一篇博客文章只是为了查找设置。只需在您其他文章中提供指向另一篇博客文章的链接,这将非常有用,因此我不必四处寻找。救我狩猎之旅!
PositiveGuy

3
Express 4.0.0需要做sudo npm install -g express-generator
mohamed-ibrahim

@getsetbro,您的意思是“ npm install”来安装依赖项。
Torsten Barthel

16

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



0

相关信息,尤其是如果您使用NTVS与Visual Studio IDE一起使用时。NTVS在Visual Studio 2012、2013中添加了NodeJS和Express工具,脚手架,项目模板。

另外,调用ExpressJS或Connect作为“ WebServer”的语言不正确。您可以创建带有或不带有它们的基本WebServer。基本的NodeJS程序也可以使用http模块来处理http请求,从而成为基本的Web服务器。


0

中间件顾名思义,中间件实际上位于中间之间。中间是什么?请求和响应的中间.. 在此图片中,请求,响应,快速服务器如何位于快速应用程序中,您可以看到请求是来自客户端的,然后快速服务器将为这些请求提供服务。这样,整个快递服务器的整个任务就变成了小的单独任务。 中间件如何位于请求和响应之间小服务器部分执行某项特定任务并将请求传递给下一个..最终完成了所有任务的响应。所有中间件都可以访问请求对象,响应对象和请求的下一个功能响应周期

这是解释中间件Express youtube视频中中间件的好例子


-7

愚蠢的简单答案

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.