读书笔记之《深入浅出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》(1)

碎碎念:距离上一次写博客已经过去了一个月,说好的半个月写一篇博客(自己打自己脸-。-)没有实现。其实主要这一个月都在看书,感觉没啥好写,但后来灵光一现,直接写读书笔记啊!把书上的一些知识点、重点用博客...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

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

上一篇读书笔记中中我们讲到了异步,这里不得不提一下Promise,现在的ES6已经原生支持Promise对象。所谓的Promise对象,其实就是一个异步操作,使用Promise的好处在于,我们可以把异...

《深入浅出NodeJS》读书笔记

NodeJS NodeJS 4个特点: 异步I/O, 事件驱动与回调, 单线程事件轮询,跨平台。 NodeJS 5个大坑:异常处理,嵌套太深,没有Sleep,多线程编程,异步转同步。 NodeJ...

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

第六章 Buffer对象Buffer对象的适用场景:处理网络协议、操作数据库、处理图片、接受上传文件,特别是在网络流和文件的操作中,要处理大量的二进制数据,所以需要用到Buffer对象,且Buffer...

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

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

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

对异步的理解

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

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

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

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

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

第1章 EXT概述 1.1  EXT版本变迁 q  EXT1.0 发布于2007年2月,这标志着EXT正式从YUI社区中独立出来,不再仅仅支持YUI,而是提供了ext-base、prototy...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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