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

尽管知道JavaScript很好,但我很困惑Node.js生态系统中的这三个项目究竟做了什么。 它是否像Rails'Rack? 有人可以解释吗?


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

我很高兴你问到这个问题,因为对于查看Node.js的人来说,这绝对是一个常见的混乱点。 这是我解释它的最佳镜头:

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

  • Connect还提供了一个createServer方法,该方法返回一个继承了http.Server扩展版本的http.Server 。 Connect的扩展主要是为了让插入中间件很容易。 这就是Connect将自己描述为“中间件框架”的原因,并且常常被类比为Ruby的Rack。

  • Express将Connect连接到http模块:它提供了一个扩展Connect的Server原型的createServer方法。 所以Connect的所有功能都在那里,再加上视图渲染和一个方便描述路由的DSL。 Ruby的Sinatra是一个很好的比喻。

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

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

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


    接受的答案是非常老的(现在是错误的)。 以下是基于当前版本的Connect(3.0)/ Express(4.0)的信息(含源代码)。

    什么Node.js附带

    http / https createServercreateServer需要一个回调(req,res),例如

    var server = http.createServer(function (request, response) {
    
        // respond
        response.write('hello client!');
        response.end();
    
    });
    
    server.listen(3000);
    

    什么连接增加

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

    它的做法很简单(实际上代码非常简短!)。 只要你调用var connect = require('connect'); var app = connect(); var connect = require('connect'); var app = connect(); 你会得到一个功能app ,可以:

  • 可以处理请求并返回响应。 这是因为你基本上得到这个功能
  • 有一个成员函数.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 。 来自源代码

    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只是一个中间件框架,具有很好的use功能。 Express不依赖于Connect(请参阅package.json)。 然而,它所做的一切连接也就是:

  • 可以像createServer一样注册到createServer因为它也只是一个可以占用req / res对(source)的函数。
  • 使用函数来注册中间件。
  • 一个实用程序listen函数用http注册自己
  • 除了连接提供了什么(它表达重复)之外,它还有许多更多的功能。 例如

  • 具有查看引擎支持。
  • 它的路由器有顶级动词(get / post等)。
  • 支持应用程序设置。
  • 中间件是共享的

    ExpressJS和连接的use功能是兼容的,因此中间件是共享的。 两者都是中间件框架,表达的不仅仅是简单的中间件框架。

    你应该使用哪一个?

    我的意见:你已经足够了解^基于上述^做出自己的选择。

  • 如果您从头开始创建类似connect / expressjs的内容,请使用http.createServer
  • 如果您正在编写中间件,测试协议等,请使用connect,因为它是http.createServer之上的一个很好的抽象
  • 如果您正在创作网站,请使用ExpressJS。
  • 大多数人应该只使用ExpressJS。

    接受的答案有什么问题

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

    它继承了http.Server的扩展版本

    错误。 它没有扩展它,正如你所看到的......使用它

    Express将Connect连接到http模块

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


    的node.js

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

    node.js作为Web服务器:express

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

    中间件和连接

    提供页面涉及许多任务。 这些任务中的许多都是众所周知的并且非常普遍,所以节点的Connect模块(可用于在节点下运行的许多模块之一)实现这些任务。
    看到目前令人印象深刻的产品:

  • 具有自定义格式支持的记录器请求记录器
  • csrf跨站请求伪造保护
  • 压缩 Gzip压缩中间件
  • basicAuth基本http认证
  • bodyParser可扩展的请求主体解析器
  • json应用程序/ json解析器
  • urlencoded应用程序/ x-www-form-urlencoded解析器
  • 部分部分/表单数据解析器
  • 超时请求超时
  • cookieParser cookie解析器
  • 会话会话管理支持与捆绑的MemoryStore
  • cookieSession基于cookie的会话支持
  • methodOverride人工 HTTP方法支持
  • responseTime计算响应时间并通过X-Response-Time公开
  • 用于静态()中间件staticCache存储器高速缓存层
  • 静态流式静态文件服务器支持Range等
  • 目录目录列出中间件
  • 虚拟主机的虚拟主机子域映射中间件
  • favicon高效favicon服务器(带默认图标)
  • 限制请求体的字节大小
  • 查询自动查询字符串解析器,填充req.query
  • errorHandler灵活的错误处理程序
  • Connect是框架,通过它你可以选择你需要的(子)模块。
    Contrib中间件页面列举了一长串附加中间件。
    Express本身带有最常见的Connect中间件。

    该怎么办?

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

    链接地址: http://www.djcxy.com/p/88893.html

    上一篇: What is Node.js' Connect, Express and "middleware"?

    下一篇: What is Node.js?