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

til*_*lda 626 middleware node.js

尽管我非常了解JavaScript,但我很困惑Node.js生态系统中这三个项目究竟做什么的.它是否像Rails的机架?有人可以解释一下吗?

Tre*_*ham 880

[ 更新:自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开发的.它添加的功能非常有用,如果你需要它,所有的低级功能仍然存在.

  • 让我对Connect感到不安的一件事是它的文档似乎并不承认Node不仅仅是一个HTTP服务器."Connect是Node.js的中间件框架" - 不,"Connect是Node.js的HTTP服务器的中间件框架" (129认同)
  • @slim我觉得你读的太多了.Connect的制造商是卓越的Node开发人员; 他们非常清楚Node不仅仅是一个HTTP服务器.但它确实*内置了一个HTTP服务器,Connect是一个可以在Node.js应用程序中使用的中间件框架. (46认同)
  • 哦,我确信Connect的制造商完全了解这一点.如果不彻底了解Node,他们就无法实现自己的目标.但对于Node的新手而言,词语的选择令人困惑; 以及Connect的新人. (22认同)
  • 晶莹剔透,所有答案都应该努力.优秀的作品特雷弗. (10认同)
  • 很棒的解释.像这样的答案有助于将新人带入Node.js生态系统.对于熟悉在Node.js中开发Web应用程序的人来说,Express就是您的最佳选择.继续Ruby类比,Express与Sinatra相当.它对于为Ajax客户端应用程序创建JSON API特别棒.我发现的一件事是,一旦应用程序达到某种程度的复杂性,就需要另一层更像Rails的层.我正在[机车](http://locomotivejs.org/)为此工作,它在Express之上进一步分层. (6认同)
  • 这个答案中的关系现在是错误的.我发布了有关更新的关系:http://stackoverflow.com/a/23957864/390330 (3认同)

bas*_*rat 154

接受的答案真的很旧(现在错了).这是基于当前版本的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);
Run Code Online (Sandbox Code Playgroud)

什么连接添加

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

它的方式非常简单(实际上代码非常简短!).一旦打电话给var connect = require('connect'); var app = connect();你,你就会得到一个app能够:

  1. 可以处理请求并返回响应.这是因为你基本上得到了这个功能
  2. 有一个成员函数.use()来管理插件(由于这个简单的代码行而来自这里).

由于1.)您可以执行以下操作:

var app = connect();

// Register with http
http.createServer(app)
    .listen(3000);
Run Code Online (Sandbox Code Playgroud)

结合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);
Run Code Online (Sandbox Code Playgroud)

Connect提供了一个实用程序功能来注册自己,http这样您就不需要进行调用http.createServer(app).它被调用listen并且代码只是创建一个新的http服务器,寄存器的connect作为回调并转发参数http.listen.从来源

app.listen = function(){
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};
Run Code Online (Sandbox Code Playgroud)

所以,你可以这样做:

var connect = require('connect');

// Create a connect dispatcher and register with http
var app = connect()
          .listen(3000);
console.log('server running on port 3000');
Run Code Online (Sandbox Code Playgroud)

http.createServer顶部有一个插件框架,它仍然是你的好老.

ExpressJS添加了什么

ExpressJS和connect是并行项目.Connect 只是一个中间件框架,具有很好的use功能.Express不依赖于Connect(请参阅package.json).然而,它确实连接所做的一切,即:

  1. 可以使用createServer类似连接注册,因为它也只是一个可以采用req/ respair()的函数.
  2. 一个使用功能进行注册的中间件.
  3. 一个实用程序listen函数,用于注册自己的http

除了提供连接(表示重复)之外,它还有许多更多功能.例如

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

中间件是共享的

useExpressJS connect 的功能兼容,因此中间件是共享的.两者都是中间件框架,表达只是一个简单的中间件框架.

你应该使用哪一个?

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

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

大多数人应该只使用ExpressJS.

接受的答案有什么问题

这些可能在某个时间点是真的,但现在错了:

继承了http.Server的扩展版本

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

Express确实将Connect所做的事情连接到http模块

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


Jua*_*nus 67

的node.js

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

node.js作为web服务器:express

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

中间件和连接

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

  • 具有自定义格式支持的记录器请求记录器
  • csrf 跨站点请求伪造保护
  • 压缩 Gzip压缩中间件
  • basicAuth 基本的http认证
  • bodyParser 可扩展请求正文解析器
  • json 应用程序/ json解析器
  • urlencoded application/x-www-form-urlencoded解析器
  • multipart multipart/form-data解析器
  • 超时 请求超时
  • cookieParser cookie解析器
  • 捆绑MemoryStore的会话会话管理支持
  • cookieSession 基于cookie的会话支持
  • methodOverride faux HTTP方法支持
  • responseTime 计算响应时间并通过X-Response-Time公开
  • static()中间件的staticCache内存缓存层
  • 静态 流式静态文件服务器支持范围等
  • 目录 目录列出中间件
  • vhost 虚拟主机子域映射中间件
  • 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并查看.现在你在.

  • 非常感谢.这是每篇博文都遗漏的那种简单废话,简单的设置可以是??? 如果你以前从未这样做过.是的,当你已经完成它很简单,但你不知道如何开始第一次!当开发人员在博客文章中忽略它时,我讨厌它,这是必不可少的.我不想找到另一个博客文章只是为了找到设置.只需在其他帖子中提供指向另一篇博客文章的链接,这非常有用,因此我无需寻找其中一篇.救我狩猎之旅! (3认同)
  • Express 4.0.0需要做sudo npm install -g express-generator (3认同)

yoj*_*o87 16

Connect为常见的HTTP服务器功能提供了"更高级别"的API,如会话管理,身份验证,日志记录等.Express基于Connect with advanced(Sinatra like)功能构建.