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

6tdlim6h  于 2023-03-29  发布在  Node.js
关注(0)|答案(9)|浏览(247)

尽管我对JavaScript非常了解,但我对Node.js生态系统中的这三个项目到底是做什么的感到困惑。它是类似于Rails的Rack吗?有人能解释一下吗?

dxxyhpgq

dxxyhpgq1#

【**更新:**Express从4.0版本开始不再使用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模块的作用相同:它提供了一个createServer方法,扩展了Connect的Server原型。所以Connect的所有功能都在那里,* 加上 * 视图渲染和一个方便的DSL来描述路由。Ruby的Sinatra是一个很好的类比。
  • 然后还有其他框架更进一步,扩展了Express!Zappa,例如,它集成了对CoffeeScript,服务器端jQuery和测试的支持。

这里有一个具体的例子来说明“中间件”的含义:以上这些工具都不能为你提供静态文件,但是只要把connect.static(Connect附带的中间件)配置成指向一个目录,你的服务器就可以访问该目录中的文件。express.staticconnect.static相同。(直到最近,两者都被称为staticProvider。)
我的印象是,现在大多数“真实的的”Node.js应用程序都是用Express开发的;它添加的特性非常有用,如果您需要,所有较低级别的功能仍然存在。

0x6upsns

0x6upsns2#

接受的答案是真的老(现在是错误的).这里的信息(与源)基于当前版本的连接(3.0)/快递(4.0).

Node.js自带的功能

http/httpscreateServer,它只接受回调(req,res),例如

var server = http.createServer(function (request, response) {

    // respond
    response.write('hello client!');
    response.end();

});

server.listen(3000);

connect增加了什么

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

它的实现方式非常简单(and in fact the code is really short!)。只要你调用var connect = require('connect'); var app = connect();,你就会得到一个函数app,它可以:
1.可以处理一个请求并返回一个响应。这是因为你基本上得到了这个函数
1.有一个成员函数.use(源代码)来管理 * 插件 *(that comes from here,因为这行代码很简单)。
由于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服务器,register的connect作为回调函数,并将参数转发到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)。但是它做了connect所做的一切,即:
1.可以像connect一样使用createServer注册,因为它也只是一个可以接受req/res对的函数(源代码)。
1.注册中间件的use函数。
1.一个实用程序listen函数,用于向http注册自身
除了connect提供的功能(表示重复)之外,它还有一堆更多的功能。
1.有视图引擎支持。
1.路由器有顶级动词(get/post等)。
1.支持应用程序设置。

中间件为 * 共享 *

ExpressJS * 和 * connect的use功能是兼容的,因此 * 中间件是共享的 *。两者都是中间件框架,express只是有更多的 * 简单的中间件框架 *。

你应该用哪一个?

我的意见是:基于上述情况,你已经有了足够的信息来做出自己的选择。

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

大多数人应该只使用ExpressJS。

接受的答案有什么错

这些在某个时间点可能是正确的,但现在是错误的:
它继承了http.Server的扩展版本
错。它没有扩展它,正如你所看到的... * 使用它 *
Express对Connect的作用与Connect对http模块的作用相同
Express 4.0甚至不依赖于connect。请参阅当前的package.json依赖项部分

n3h0vuf2

n3h0vuf23#

node.js

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

node.js作为web服务器:快车

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

中间件及连接

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

*loggerrequest logger,支持自定义格式
*csrf跨站点请求伪造保护
*compressGzip压缩中间件
*basicAuth基础http认证
*bodyParser可扩展请求体解析器
*jsonapplication/json parser
*urlencodedapplication/x-www-form-urlencoded解析器
*multipartmultipart/form-data parser
*timeout请求超时
*cookieParsercookie解析器
*session捆绑MemoryStore的会话管理支持
*cookieSession基于cookie的会话支持
*methodOverridefaux HTTP方法支持
*responseTime计算响应时间,并通过X-Response-Time公开
*staticCachestatic()中间件的内存缓存层
*静态流式静态文件服务器支持Range等
*目录目录列表中间件
*vhost虚拟主机子域Map中间件
*favicon高效favicon服务器(默认图标)
*limit限制请求正文的字节大小
*query自动querystring解析器,填充req.query
*errorHandler灵活的错误处理器

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

怎么办?

安装node.js。
Node自带 npm,即 *node包管理器 *。
命令npm install -g express将下载并全局安装express(检查express guide)。
在命令行中(而不是在node中)运行express foo将创建一个名为foo的随时可以运行的应用程序。切换到它的(新创建的)目录,并使用命令node <appname>和node运行它,然后打开http://localhost:3000并查看。现在您已经进入了。

wlzqhblo

wlzqhblo4#

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

bqf10yzr

bqf10yzr5#

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

8ehkhllq

8ehkhllq6#

相关信息,特别是如果您使用NTVS使用Visual Studio IDE。NTVS将NodeJS和Express工具,脚手架,项目模板添加到Visual Studio 2012,2013中。
此外,将ExpressJS或Connect称为“WebServer”的措辞是不正确的。您可以使用或不使用它们来创建基本的WebServer。基本的NodeJS程序也可以使用http模块来处理http请求,从而成为一个基本的Web服务器。

xpcnnkqh

xpcnnkqh7#

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

sqxo8psd

sqxo8psd8#

中间件是运行在请求传入和响应从我们的API发出之间或中间的特殊函数。
这里Next在ExpressJS中用作请求和RE之间中间件

1wnzp6jl

1wnzp6jl9#

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

相关问题