尽管我很了解JavaScript,但我还是不明白Node.js生态系统中的这三个项目到底是做什么的。是不是有点像《Rails’Rack》?有人能解释一下吗?


当前回答

公认的答案已经过时了(现在也是错误的)。以下是基于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);

连接增加了什么

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

它的实现方式非常简单(实际上代码非常短!)。当你调用var connect = require('connect');Var app = connect();你得到一个功能应用程序,可以:

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

因为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服务器,将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只是一个中间件框架,具有很好的使用功能。Express不依赖于Connect(参见package.json)。然而,它做的一切连接,即:

可以像connect一样注册createServer,因为它也是一个可以接受req/res对的函数(源)。 一个用来注册中间件的use函数。 一个实用程序监听函数将自己注册到http

除了connect提供的功能(表示副本)之外,它还有许多其他特性。如。

具有视图引擎支持。 路由器有顶级动词(get/post等)。 具有应用程序设置支持。

共享中间件

ExpressJS和connect的使用功能是兼容的,因此中间件是共享的。两者都是中间件框架,express不仅仅是一个简单的中间件框架。

你应该使用哪一个?

我的观点是:基于上述,你已经得到了足够的信息来做出自己的选择。

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

大多数人应该只使用ExpressJS。

公认的答案有什么问题

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

它继承了http的扩展版本。服务器

错了。它没有延伸,正如你所看到的……使用它

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

Express 4.0甚至不依赖于连接。查看当前包。Json依赖项部分

其他回答

愚蠢的简单答案

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

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

公认的答案已经过时了(现在也是错误的)。以下是基于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);

连接增加了什么

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

它的实现方式非常简单(实际上代码非常短!)。当你调用var connect = require('connect');Var app = connect();你得到一个功能应用程序,可以:

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

因为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服务器,将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只是一个中间件框架,具有很好的使用功能。Express不依赖于Connect(参见package.json)。然而,它做的一切连接,即:

可以像connect一样注册createServer,因为它也是一个可以接受req/res对的函数(源)。 一个用来注册中间件的use函数。 一个实用程序监听函数将自己注册到http

除了connect提供的功能(表示副本)之外,它还有许多其他特性。如。

具有视图引擎支持。 路由器有顶级动词(get/post等)。 具有应用程序设置支持。

共享中间件

ExpressJS和connect的使用功能是兼容的,因此中间件是共享的。两者都是中间件框架,express不仅仅是一个简单的中间件框架。

你应该使用哪一个?

我的观点是:基于上述,你已经得到了足够的信息来做出自己的选择。

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

大多数人应该只使用ExpressJS。

公认的答案有什么问题

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

它继承了http的扩展版本。服务器

错了。它没有延伸,正如你所看到的……使用它

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

Express 4.0甚至不依赖于连接。查看当前包。Json依赖项部分

相关信息,特别是如果您正在使用NTVS与Visual Studio IDE一起工作。NTVS将NodeJS和Express工具,脚手架,项目模板添加到Visual Studio 2012, 2013。

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

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