接受的答案真的很旧(现在是错误的)。以下是基于当前版本的 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,它可以:
- 可以处理请求并返回响应。这是因为你基本上得到this function
- 有一个成员函数
.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.listen。 From 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)。然而,它完成了连接所做的一切,即:
- 可以像连接一样使用
createServer 注册,因为它也只是一个可以采用req/res 对(source) 的函数。
-
use function to register middleware.
- 一个实用程序
listen 函数到register itself with http
除了 connect 提供的功能(表示重复)之外,它还有许多其他功能。例如
- 有view engine support。
- 拥有顶级verbs (get/post etc.) for its router。
- 有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