前面几篇反复提到“高质量模块”;connect和express无论从代码的结构、可读性以及UT、文档等各个方面,都是node模块开发的榜样。这篇文章基本是这份slide展开讨论的缩减版,其中的源码分析留在后续的《connect源码分析》、《express源码分析》中展开。

对connect和express的兴趣来自于前不久组里的一个项目,当时遇到这些需求/纠结:

  • 项目需要web server
  • tomcat/apache太大,以至于无法短时间内摸清他们的实现细节
  • 刚好想了解web server实现细节
  • 一直觉得connect 中间件(middleware)这个名词比较神秘
  • 想了解node模块开发、发布细节(这是中途产生的想法)

TJ 和他的 connect、express

connectexpress出自同一作者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处理流程的位置,将中间件大致分为

  1. Pre-Request 通常用来改写request的原始数据
  2. Request/Response 大部分中间件都在这里,功能各异
  3. 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,有兴趣的同学请继续:

  • connect项目的examples
  • 笔者之前写的demo(解压后先运行npm install, demo在/connect中)

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:

  • express项目的examples
  • 笔者之前写的demo(解压后先运行npm install, demo在/express中)

connect & express简介的更多相关文章

  1. connect/express 的参考

    1.Node.js[5] connect & express简介    对connect中间件的分类比较容易理解. http://www.cnblogs.com/luics/archive/2 ...

  2. Express 简介

    Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速 ...

  3. Express简介、安装

    Express 基于Node.js平台,快速.开放.极简的web开发框架,是目前最流行的基于Node.js的web开发框架,它提供一系列强大的功能,比如: 路由控制 参数获取 send和sendFil ...

  4. IIS Express简介

    当前程序员只能通过下面两种Web服务器之一来开发和测试ASP.NET网站程序: 1. Visual Studio自带的ASP.NET开发服务器(webdev.exe). 2. Windows自带的II ...

  5. express简介

    Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速地搭建一个完整功能的网 ...

  6. 第1章 Express MongoDB 搭建多人博客

    学习环境 Node.js : 0.10.22 + Express : 3.4.4 + MongoDB : 2.4.8 + 快速开始 安装 Express express 是 Node.js 上最流行的 ...

  7. Nodejs学习笔记(五)--- Express安装入门与模版引擎ejs

    目录 前言 Express简介和安装 运行第一个基于express框架的Web 模版引擎 ejs express项目结构 express项目分析 app.set(name,value) app.use ...

  8. Express安装入门与模版引擎ejs

    Express安装入门与模版引擎ejs 目录 前言 Express简介和安装 运行第一个基于express框架的Web 模版引擎 ejs express项目结构 express项目分析 app.set ...

  9. Express 学习笔记纯干货(Routing、Middleware、托管静态文件、view engine 等等)

    原始文章链接:http://www.lovebxm.com/2017/07/14/express-primer/ 1. Express 简介 Express 是基于 Node.js 平台,快速.开放. ...

随机推荐

  1. 理解Miller-Rabbin算法

    转自:http://www.dxmtb.com/blog/miller-rabbin/ 普通的素数测试我们有O(√ n)的试除算法.事实上,我们有O(slog³n)的算法. 定理一:假如p是质数,且( ...

  2. JQ 练习题

    1.留言板 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  3. .net学习笔记---xml操作及读写

    一.XML文件操作中与.Net中对应的类 微软的.NET框架在System.xml命名空间提供了一系列的类用于Dom的实现. 以下给出XML文档的组成部分对应.NET中的类: XML文档组成部分 对应 ...

  4. MySQL zabbix

    http://liqingbiao.blog.51cto.com/3044896/1712080

  5. HTML5学习之画布和SVG(四)

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. Delphi面向对象的属性

    可以把属性看成是能对类中的数据进行修改和执行代码的特殊的辅助域.对于组件来说,属性就是列在Object Inspector窗口的内容.下面的例子定义了一个有属性的简单对象 TMyObject = cl ...

  7. ExcelReport第三篇:扩展元素格式化器

    导航 目   录:基于NPOI的报表引擎——ExcelReport 上一篇:ExcelReport源码解析 概述 上篇中已介绍了ExcelRepor的架构,本篇将通过例子讲述如何扩展元素格式化器以满足 ...

  8. 如何减少JS的全局变量污染

    A,唯一变量 B,闭包

  9. hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  10. [LeetCode] Implement strStr()

    Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if need ...