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

Posted

技术标签:

【中文标题】什么是 Node.js 的 Connect、Express 和“中间件”?【英文标题】:What is Node.js' Connect, Express and "middleware"? 【发布时间】:2011-07-14 03:35:42 【问题描述】:

尽管对 javascript 非常了解,但我对 Node.js 生态系统中的这三个项目究竟做什么感到困惑。是不是类似于 Rails 的机架?谁能解释一下?

【问题讨论】:

我没有使用过 connect,但 this page 确实让它听起来类似于 Rails 的 Rack。你了解 Node 上下文之外的中间件是什么吗? 老实说,没有我想的那么多。据我所知,它是执行所有应用程序前功能(如路由、gzip、标头、cookies..)的层?我对吗?那么它的工作方式是不是在 MVC 框架(如 Rails)内部而是在中间件中路由到正确的 MVC 控制器/动作? 参见这里project70.com/nodejs/understanding-connect-and-middleware 这将清除您的所有疑虑并回答您的更多问题 我知道为时已晚(希望有人向下滚动...),但阅读以下博客文章将清除所有问题你有关于 Connect、Express 和 Middleware 的知识。它还教你一些关于 Node.js 的知识。 http://evanhahn.com/understanding-express/ @DiegoCaxito 您的链接已损坏。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

很高兴您问到这个问题,因为对于查看 Node.js 的人来说,这绝对是一个常见的困惑点。这是我最好的解释:

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

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

Express 对 Connect 的作用与 Connect 对 http 模块的作用相同:它提供了一个扩展 Connect 的 Server 原型的 createServer 方法。所以 Connect 的所有功能都在那里,plus 视图渲染和用于描述路由的方便的 DSL。 Ruby 的 Sinatra 就是一个很好的类比。

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

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

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

【讨论】:

Connect 让我感到不安的一点是,它的文档似乎并没有承认 Node 不仅仅是一个 HTTP 服务器。 “Connect 是 Node.js 的中间件框架”——不,“Connect 是 Node.js 的 HTTP 服务器的中间件框架” @slim 我认为你读得太多了。 Connect 的制造者是杰出的 Node 开发者;他们很清楚 Node 不仅仅是一个 HTTP 服务器。但它确实一个内置的 HTTP 服务器,而且 Connect 是一个中间件框架,你可以在你的 Node.js 应用程序中使用它。 哦,我相信 Connect 的制造商完全意识到这一点。如果没有对 Node.js 的透彻理解,他们就不可能取得现在的成就。但是对于 Node 的新手来说,单词的选择是令人困惑的;以及 Connect 的新手。 一清二楚,所有答案都应该争取什么。出色的工作特雷弗。 很好的解释。像这样的答案有助于将新人带入 Node.js 生态系统。对于熟悉使用 Node.js 开发 Web 应用程序的人来说,Express 是开始的地方。继续 Ruby 的类比,Express 可与 Sinatra 相媲美。它特别适合为 Ajax 客户端应用程序创建 JSON API。我发现的一件事是,一旦应用程序达到一定程度的复杂性,就需要另一个更像 Rails 的层。为此,我正在开发Locomotive,它在 Express 之上进一步分层。【参考方案3】:

node.js

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

node.js 作为 web 服务器:express

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

中间件和连接

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

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

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

怎么办?

安装 node.js。 Node 带有 npmnode 包管理器。 命令npm install -g express 将在全球范围内下载并安装 express(检查express guide)。 在命令行(不在节点中)运行express foo 将创建一个名为 foo 的可立即运行的应用程序。切换到它的(新创建的)目录并使用命令node <appname> 使用node 运行它,然后打开http://localhost:3000 并查看。 现在你进来了。

【讨论】:

很好的回复,谢谢。这是每篇博文都错过的那种简单的废话,简单的设置可以是???如果你以前从未做过。是的,当您已经完成时,这很简单,但您不知道如何第一次开始!当开发人员在博客文章中忽略这一点时,我讨厌它,这是必不可少的。我不想为了找到设置而查找另一篇博客文章。只需在您的其他帖子中提供另一个博客帖子的链接,这非常有帮助,所以我不必四处寻找。拯救我的狩猎之旅! Express 4.0.0 需要做 sudo npm install -g express-generator @getsetbro 你只是说'npm install'来安装依赖项。【参考方案4】:

接受的答案真的很旧(现在是错误的)。以下是基于当前版本的 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);

connect 增加了什么

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

这样做的方式非常简单 (and in fact the code is really short!)。只要你调用var connect = require('connect'); var app = connect();,你就会得到一个函数app,它可以:

    可以处理请求并返回响应。这是因为你基本上得到this function 有一个成员函数.use (source) 来管理插件 (that comes from here 因为this simple line of code)。

由于 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。 From source

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 (see package.json)。然而,它完成了连接所做的一切,即:

    可以像连接一样使用createServer 注册,因为它也只是一个可以采用req/res 对(source) 的函数。 use function to register middleware. 一个实用程序listen 函数到register itself with http

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

    有view engine support。 拥有***verbs (get/post etc.) for its router。 有application settings 支持。

中间件是共享的

ExpressJS 的use 函数 connect 是兼容的,因此中间件是共享的。两者都是中间件框架,express 不仅仅是一个简单的中间件框架

你应该使用哪一个?

我的意见:你已经充分了解了^基于以上^做出你自己的选择。

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

大多数人应该只使用 ExpressJS。

接受的答案有什么问题

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

继承了 http.Server 的扩展版本

错了。它没有扩展它,正如你所见...... 使用它

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

Express 4.0 甚至不依赖于连接。 see the current package.json dependencies section

【讨论】:

你说让你能够处理请求并返回响应,但人们说 Express 真的是 Web 服务器......我很困惑。发回响应不需要网络服务器功能(如 Express)吗? 好东西,谢谢!非常有帮助...尤其是不知道 connect 真的是提供路由的东西,而 express 只是继承了它,它不是路由的唯一/源提供者。最后的用例很有帮助,因为我认为我必须使用 connect 和 express,但实际上你需要使用的只是 web 应用程序的 express,所以这为我清除了一件大事。你不安装两个,你安装一个或另一个! 你的答案应该是最重要的。当我阅读接受的答案时,我赞成它。但是在阅读了您的答案后...naahhh【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

愚蠢的简单答案

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

【讨论】:

【参考方案8】:

中间件,顾名思义,实际上中间件位于中间..中间是什么?请求和响应的中间..how request,response,express server sit in express app 在这张图片中,您可以看到请求来自客户端,然后快速服务器服务器为这些请求提供服务.. 然后让我们深入挖掘.. 实际上,我们可以像这样将整个快速服务器的整个任务划分为小的单独任务。 how middleware sit between request and response 一小块服务器部件执行某些特定任务并将请求传递给下一个.. 最终完成所有任务响应已经做出.. 所有中间件都可以访问请求对象、响应对象和请求响应周期的下一个函数。

这是在 express youtube video for middleware 中解释中间件的好例子

【讨论】:

以上是关于什么是 Node.js 的 Connect、Express 和“中间件”?的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义 Http(s) 代理和 Connect.js 中间件的 Node.js 代理

connect & express简介

Node.js 连接MySQL时 出现 connect ECONNREFUSED 127.0.0.1:3306

Keycloak node.js 适配器不会在注销时使 connect.sid 会话 cookie 无效

TypeError:无法调用 null 的方法“查询”-使用 Heroku node.js 调用 pg.connect 时

Node.js 中的中间件设计模式:连接