尽管我很了解JavaScript,但我还是不明白Node.js生态系统中的这三个项目到底是做什么的。是不是有点像《Rails’Rack》?有人能解释一下吗?
当前回答
middleware as the name suggests actually middleware is sit between middle.. middle of what? middle of request and response..how request,response,express server sit in express app in this picture you can see requests are coming from client then the express server server serves those requests.. then lets dig deeper.. actually we can divide this whole express server's whole task in to small seperate tasks like in this way. how middleware sit between request and response small chunk of server parts doing some particular task and passed request to next one.. finally doing all the tasks response has been made.. all middle ware can access request object,response object and next function of request response cycle..
这是一个很好的例子来解释中间件在表达YouTube视频中间件
其他回答
公认的答案已经过时了(现在也是错误的)。以下是基于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依赖项部分
middleware as the name suggests actually middleware is sit between middle.. middle of what? middle of request and response..how request,response,express server sit in express app in this picture you can see requests are coming from client then the express server server serves those requests.. then lets dig deeper.. actually we can divide this whole express server's whole task in to small seperate tasks like in this way. how middleware sit between request and response small chunk of server parts doing some particular task and passed request to next one.. finally doing all the tasks response has been made.. all middle ware can access request object,response object and next function of request response cycle..
这是一个很好的例子来解释中间件在表达YouTube视频中间件
Connect为常见的HTTP服务器功能(如会话管理、身份验证、日志记录等)提供了“更高级别”的api。Express是建立在具有高级功能(类似Sinatra)的Connect之上的。
Node.js本身提供了一个HTTP模块,其createServer方法返回一个对象,您可以使用该对象响应HTTP请求。该对象继承了http。服务器原型。
[更新:从4.0版本开始,Express不再使用Connect。]但是,Express仍然与为Connect编写的中间件兼容。我的原始答案如下。
我很高兴你问了这个问题,因为对于那些使用Node.js的人来说,这绝对是一个常见的困惑点。下面是我最好的解释:
Node.js itself offers an http module, whose createServer method returns an object that you can use to respond to HTTP requests. That object inherits the http.Server prototype. Connect also offers a createServer method, which returns an object that inherits an extended version of http.Server. Connect's extensions are mainly there to make it easy to plug in middleware. That's why Connect describes itself as a "middleware framework," and is often analogized to Ruby's Rack. Express does to Connect what Connect does to the http module: It offers a createServer method that extends Connect's Server prototype. So all of the functionality of Connect is there, plus view rendering and a handy DSL for describing routes. Ruby's Sinatra is a good analogy. Then there are other frameworks that go even further and extend Express! Zappa, for instance, which integrates support for CoffeeScript, server-side jQuery, and testing.
这里有一个关于“中间件”含义的具体例子:开箱即用,上面没有一个为您提供静态文件。但只要加上连接。static (Connect附带的中间件),配置为指向一个目录,您的服务器将提供对该目录中的文件的访问。注意,Express也提供Connect的中间件;表达。Static和connect.static是一样的。(直到最近,两者都被称为staticProvider。)
我的印象是,现在大多数“真正的”Node.js应用都是用Express开发的;它添加的功能非常有用,如果你想要,所有低级功能仍然存在。
推荐文章
- NPM清洁模块
- 在Node.js中加载基本HTML
- Node.js和CPU密集型请求
- 为什么在节点REPL中没有定义__dirname ?
- 在Node.js中克隆对象
- 中间件到底是什么?
- Node.js中的process.env.PORT是什么?
- js的Mongoose.js字符串到ObjectId函数
- ELIFECYCLE Node.js错误是什么意思?
- 如何完全卸载Ubuntu中的nodejs, npm和node
- 在猫鼬模式中添加created_at和updated_at字段
- 我如何把变量javascript字符串?
- 如何强制tsc忽略node_modules文件夹?
- NPM全局安装“无法找到模块”
- MongoDB和Mongoose的区别