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

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

【问题讨论】:

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

标签: node.js middleware


【解决方案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,它可以:

    1. 可以处理请求并返回响应。这是因为你基本上得到this function
    2. 有一个成员函数.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.listenFrom 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)。然而,它完成了连接所做的一切,即:

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

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

    1. view engine support
    2. 拥有顶级verbs (get/post etc.) for its router
    3. 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 中解释中间件的好例子

          【讨论】:

            猜你喜欢
            • 2013-03-22
            • 2011-08-13
            • 2013-03-12
            • 2018-01-02
            • 2012-04-27
            • 1970-01-01
            • 1970-01-01
            • 2019-02-21
            • 1970-01-01
            相关资源
            最近更新 更多