读书笔记之《深入浅出Node.js》(4)

原创 2016年06月01日 09:37:15

第八章 构建Web应用

在具体的业务中,我们有如下的这些需求(实际开发中一般用 Express框架,它帮我们做了很多事情),这里以访问 http://127.0.0.1/admin/head/on?sort=-startedAt&role=normal为例来说说一个一个框架所做的事情

  • 请求方法的判断(req.method)
  • URL的路径解析(用url.parse解析出/admin、/head、/on)
  • URL中查询字符串的解析(用querystring模块 解析得到?sort=-startedAt&role=normal)
  • Cookie的解析,通过CookieID查询得到Session
  • 表单数据的解析
  • 处理文件上传

设置缓存来加速网站的打开(比如网站的图标之类的长期不会改变的东西),通过读取request头部中的if-modified-since和if-none-match来判断,具体代码如下

//处理if-modified-since
var http = require('http');
var crypto = require('crypto');

//将文件对应的hash值作为Etag的值
var getHash = function(str){
  var shaum = crypto.createHash('sha1');
  return shaum.update(str).digest('base64');
}

//这里是伪代码,重要的是理解思路
http.createServer(function (req, res) {
  fs.readFile(filename, function(err, file){
      var hash = getHash(file);
      var noneMatch = req.header['if-none-match'];
      if (hash === noneMatch) {
        res.writeHead(304,"Not Modified");
        res.end();
      } else {
        res.setHeader("ETag",hash); 
        res.writeHead(200,"ok");
        res.end(file);       
      }
    });
}).listen(8000);
//处理ETag
var http = require('http');

//这里是伪代码,重要的是理解思路
http.createServer(function (req, res) {
  if (lastModified === req.headers["if-modified-since"]) {
    res.writeHead(304);
    res.end();
  } else {
    fs.readFile(filename, function(err, file){
      var lastModified = stat.mtime.toUTCString();
      res.setHeader("Last-Modified":lastModified);
      res.writeHead(200,"ok");
      res.end(file);
    });
  }
}).listen(8000);

中间件

中间件的设计就是Unix哲学的体现,专注简单,小而美,组合起来发挥强大的力量。(直接拍照片了哈~~)
中间件
中间件能简化和隔离基础设施(cookie、session、url解析、req.body中携带的信息)与业务逻辑(courseOpen、userAdd),最终提高开发效率。以connect为例,传递的参数和上下文就是req和res,一个中间件处理完成后,调用next()方法通知下一个中间件进行处理。

模板

模板技术的本质就是在拼接字符串,将hello <%=text%> 变为 hello world,同时内部需要提供转义功能,将能形成HTML标签的字符(&、<、>、”、’)转换为安全的字符(&lt、&gt)。
几个步骤如下:

  • 语法分析,取出普通字符串和表达式。<%=%>的正则表达式为/<%([\s\S]+?)%>/
  • 处理表达式

第九章 进程

Node内置了child-process模块,可以用于创建子进程,有几个CPU就创建几个子进程。子进程中用process.on, process.send进行交互,主进程中用child.on,child.send进行交互.。示意图如下:

IPC

IPC进程间通信(Inter-Process Communication) 。进程间通信的目的是为了让不同的进程能够互相访问资源并进行协调工作。实现进程间通信的技术有很多,如命名管道、匿名管道、socket、信号量、共享内存、消息队列、DomainSocket等。Node中实现IPC通道的是管道(pipe)技术。但此管道非彼管道,在Node中管道是个抽象层面的称呼,具体细节实现由libuv提供,在Windows下由命名管道(named pipe)实现,*nix系统则采用Unix Domain Socket实现。示意图如下:
IPC
这边为了解决不同进程监听同一个端口时发生的端口被占用的问题,Node中引入了进程间发送句柄这样的概念。

句柄是一种用来标识资源的引用,它的内部包含了指向对象的文件描述符,所以句柄可以用来标识一个服务器端socket对象、一个客户端socket对象、一个TCP套接字、一个管道。

有了句柄,我们可以做到很不可思议的事情,例如将一个TCP服务器直接发给了子进程。如图所示。
直接发送服务器给子进程
面对访问量特别大的端口,我们可以启动多个进程,让他们监听一个端口,且这种监听是抢占式的(谁先抢到谁上)。实现的抢占式效果如图所示:
抢占式服务

原理:

send方法在发送句柄时,其实是把文件描述符发送给子进程,所以子进程可以在创建TCP服务器对象后监听到对应的文件描述符上,从而避免了监听到相同端口时发生的异常,在多个应用监听相同端口时,文件描述符同一时间只能被一个进程使用,这样就形成了抢占式服务。
发送消息

小结:

以上功能在cluster模块均有实现(果然已经有了现成的轮子-。-,不过了解一下原理对未来的提升还是有好处的~~)

第十章:测试

不用废话了,直接用mocha~~

版权声明:本文为博主原创文章,未经博主允许不得转载。

【深入浅出Node.js系列八】一个基于Node.js完整的Web应用实战

1 Web用例 我们来把目标设定得简单点,不过也要够实际才行: 用户可以通过浏览器使用我们的应用。 当用户请求http://domain/start时,可以看到一个欢迎页面,页面上有一个文件...
  • zhangyuan19880606
  • zhangyuan19880606
  • 2016年05月26日 17:42
  • 1986

[读书笔记]深入理解java虚拟机

第二章 java内存区域与内存溢出异常 一,运行时数据区域: 1.        程序计数器:当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一跳需要执行的...
  • hanekawa
  • hanekawa
  • 2016年07月20日 21:50
  • 1611

【深入浅出Node.js系列九】一起撸Node.js

1 基本语法 Node.js 的基础是 JavaScript 这门 脚本语言。而大多数的脚本语言一个共同的特点就是“弱类型”。 不同于 PHP 的是,PHP 就是是有了新变量也无需申明,而...
  • zhangyuan19880606
  • zhangyuan19880606
  • 2016年05月27日 16:33
  • 1273

深入浅出Node.js读书笔记

今天终于把朴灵老师写的《深入浅出Node.js》给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架、库的使用层面上,而是从不同的视角来揭示Node自己内在的特点和结构...
  • he90227
  • he90227
  • 2015年10月09日 17:03
  • 571

《深入浅出Node.js》读书笔记+个人思考(二):异步I/O

对异步的理解
  • nzyalj
  • nzyalj
  • 2017年03月12日 14:08
  • 308

读书笔记——深入浅出node.js——构建http服务

朴灵大师的书确实不错,让我受益非浅。 个人理解,仅做参考。构建http服务在Web领域,大多编程语言需要专门的Web服务器作为容器,如ASP、ASP.NET需要IIS,PHP需要搭载Apache或Ng...
  • qq_24145735
  • qq_24145735
  • 2015年12月20日 11:27
  • 545

JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记4

只要图片高度不一致,通过这样的思路很快就可以看到一个“瀑布流”,这仅仅是静态的,一般滚动的时候瀑布流都会添加数据,所以接下来就是添加滚动事件,只要有滚动就计算然后补充数据。...
  • kgsew
  • kgsew
  • 2014年11月10日 11:45
  • 912

[读书笔记]深入浅出NodeJS——Node中的异步I/O

JS执行是单线程的,但Node底层有一个线程池,使用多线程来实现异步I/O Node的异步I/O 几大要素:事件循环、观察者、请求对象、I/O线程池。 事件循环 进程启动,会创建一个whil...
  • pengpengrose0406
  • pengpengrose0406
  • 2015年07月20日 10:08
  • 338

深入浅出Ext JS(第2版)读书笔记(1)

第1章 EXT概述 1.1  EXT版本变迁 q  EXT1.0 发布于2007年2月,这标志着EXT正式从YUI社区中独立出来,不再仅仅支持YUI,而是提供了ext-base、prototy...
  • mouyong
  • mouyong
  • 2012年03月27日 08:48
  • 1576

JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记3

技术很多,例子很多,只好慢慢学,慢慢实践!!现在学的这本书是【JavaScript实战----JavaScript、jQuery、HTML5、Node.js实例大全】 JavaScript、jQue...
  • ye_mingjia
  • ye_mingjia
  • 2015年01月04日 18:26
  • 264
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:读书笔记之《深入浅出Node.js》(4)
举报原因:
原因补充:

(最多只允许输入30个字)