- Node.js[5] connect & express简介
- Node.js[4] 第一个模块
- Node.js[3] 俯瞰API (整理中)
- Node.js[2] Hello Node
- Node.js[1] 俯瞰NPM
- Node.js[0] 简介
前面几篇反复提到“高质量模块”;connect和express无论从代码的结构、可读性以及UT、文档等各个方面,都是node模块开发的榜样。这篇文章基本是这份slide展开讨论的缩减版,其中的源码分析留在后续的《connect源码分析》、《express源码分析》中展开。
对connect和express的兴趣来自于前不久组里的一个项目,当时遇到这些需求/纠结:
- 项目需要web server
- tomcat/apache太大,以至于无法短时间内摸清他们的实现细节
- 刚好想了解web server实现细节
- 一直觉得connect 中间件(middleware)这个名词比较神秘
- 想了解node模块开发、发布细节(这是中途产生的想法)
TJ 和他的 connect、express
connect和express出自同一作者TJ Holowaychuk(之后简称TJ)。从依赖性看,express基于connect;但从2个项目的git提交历史来看,实际上先有express项目(2009-6-27),2010-5-27 前后connect从express项目分化出来(express 0.12.0)。express 0.12.0这个版本实际上已经有了中间件(middleware)雏形,只不过当时还叫plugin,那时已经有了logger,static,session等中间件。
《Node.js[1] 俯瞰NPM》中已经提到过TJ同学,这位node先锋长久以来(至少半年)占据着npm registry “最高产作者”的榜单冠军;“最多依赖模块”前十位有2个来自TJ(正是connect和express) ;“最受欢迎模块”前十位竟然有4个来自TJ。
Connect
Connect is a middleware framework for node.
Connect是一个node中间件(middleware)框架。如果把一个http处理过程比作是污水处理,中间件就像是一层层的过滤网。每个中间件在http处理过程中通过改写request或(和)response的数据、状态,实现了特定的功能。这些功能非常广泛,下图列出了connect所有内置中间件和部分第三方中间件。 这里能看到完整的中间件列表。
下图根据中间件在整个http处理流程的位置,将中间件大致分为
- Pre-Request 通常用来改写request的原始数据
- Request/Response 大部分中间件都在这里,功能各异
- Post-Response 全局异常处理,改写response数据等
为何要有connect?
下面的代码展示了使用connect和node原生api写一个静态文件服务器:
/*
* 使用connect实现的静态文件处理
*/
var connect = require('connect');
connect(connect.static(__dirname + '/public')).listen(//监听
3000,
function() {
console.log('Connect started on port 3000');
}
);
/*
* 使用node原生api实现
*/
var http = require('http');
http.createServer(
function(req, res) {
var url = require('url');
var fs = require('fs');
var pathname = __dirname + '/public' + url.parse(req.url).pathname;
//读取本地文件
fs.readFile(
pathname,
function(err, data) {
//异常处理
if (err) {
res.writeHead(500);
res.end('500');
}
else {
res.end(data);
}
}
);
}
).listen(//监听
3001,
function() {
console.log('http.Server started on port 3001');
}
);
尽管node原生api已经花费这么些行代码,但其实仍然留下一个简单静态文件服务器的诸多方面未经处理,比如:404等异常未处理、没有基本的文件路径安全验证(实际上我们可以访问到整个os文件系统)、全局异常处理等等;与此同时connect已经将这些问题都处理好了。
上面的例子是connect最初带给我的兴奋:写得更少做得更多(呵呵,窜了,deli文具?jquery?)。connect真正难能可贵的还是其良好的架构、便捷高效的扩展性,更多的细节留在后续源码分析。
这里再给出一些connect demo,有兴趣的同学请继续:
Express
Express: web application framework for node
Express是以web应用框架的面貌出现的,基于connect;准确说是在connect基础上添加一个更接近业务开发的框架。下图是express架构的简要分解:
express提供的框架比较灵活,你可以在express基础上实现MVC,也可以实现更多你希望的开发模式。express源码下的examples给出了express的各种用法,其中就有MVC。
从图中可以看到,express也实现了一些特殊的connect中间件
- route middleware,实现路由
- express.middleware,初始化express全局参数
- mounted child app middleware,挂载子app
更多细节留在源码分析中详述。
最简单的express demo代码和connect太过相似,这里给出一些较复杂的express demo: