上一章讲到怎么样用原生node.js来获取GET、POST(urlencoded,formData)的参数,这一次我们更进一步,讲一下以下的点:

1.压缩(zlib)

2.流(stream)

3.路由


一、压缩

所有网站其实在发送到我们的客户端的时候,数据都是经过压缩的,不然会造成大量的流量损失,流量可都是钱啊~~~

node里面有一个模块叫zlib,是专门用来压缩数据的,而我们最常用的就是gzip

  1. const zlib = require('zlib');
  2. //创建gz对象,之后就可以对流进行压缩处理了
  3. let gz = zlib.createGzip();

二、流

为什么要用流处理呢?例如之前的写法,fs.readFile是读取完整个文件才把整个文件的data输出的,这样就会造成一个机器资源使用不充分的问题:

一开始读取文件的时候,磁盘在高速工作,但是带宽却空闲着,

之后读取完文件后,带宽在忙碌传输,磁盘却空闲了。

用流来处理,就可以做到“磁盘读到多少就用带宽传多少”,充分利用服务器的资源

  1. //创建一个读取流
  2. let rs = fs.createReadStream(`www${pathname}`);
  3. let gz = zlib.createGzip();
  4. //书写响应头,告诉浏览器我们的数据格式是经过压缩的gzip
  5. res.setHeader('Content-Encoding','gzip');
  6. //读取流先传给gz,再传给响应流
  7. rs.pipe(gz).pipe(res);
  8. rs.on('error',err=>{
  9. //如果错误,要把之前的响应头去掉,不然浏览器会解析错误
  10. res.removeHeader('Content-Encoding');
  11. res.writeHeader(404);
  12. res.write('not found!!');
  13. res.end();
  14. })

三、路由

所谓路由,就是接口的地址入口,我们大可以这样写:

  1. switch(pathname){
  2. case '/login':
  3. //...
  4. break;
  5. case '/reg':
  6. //...
  7. break;
  8. default:
  9. //...
  10. break;
  11. }

不过这样写,导致路由和功能代码严重的耦合在一起,这显然不是我们想要的

node给我们提供了一个叫EventEmitter的东西,实现了在js的响应式编程

因为node.js的引用是单例的,因此我们可以先创建一个module作为全局的EventEmitter,router.js

  1. const Event = require('events').EventEmitter;
  2.  
  3. module.exports = new Event();

在server.js那加入EventEmitter的触发:

  1. const http = require('http');
  2. const fs = require('fs');
  3. const router = require('./libs/router');
  4. const url = require('url');
  5. const zlib = require('zlib');
  6. //在'./router/Users'上面注册了一些接口
  7. require('./router/Users');
  8.  
  9. http.createServer((req,res)=>{
  10. let {pathname,query}=url.parse(req.url,true);
  11. req.query = query;
  12. res.send = msg=>{
  13. if(typeof msg!="string"&&!(msg instanceof Buffer)){
  14. msg = JSON.stringify(msg);
  15. }
  16. res.write(msg);
  17. }
  18. //router.emit会触发对应的接口,如果事先有注册对应的接口返回true,否则返回false,我们就认为这个请求是在请求文件
  19. if(!router.emit(pathname,req,res)){
  20. let rs = fs.createReadStream(`www${pathname}`);
  21. let gz = zlib.createGzip();
  22. res.setHeader('Content-Encoding','gzip');
  23. rs.pipe(gz).pipe(res);
  24. rs.on('error',err=>{
  25. res.removeHeader('Content-Encoding');
  26. res.writeHeader(404);
  27. res.write('not found!!');
  28. res.end();
  29. })
  30. }
  31. }).listen(8088);

做完这些,我们就可以在多个模块来“注册”接口了

  1. const router = require('../../libs/router.js');
  2.  
  3. let users = {
  4. rick : 123456
  5. };
  6. //注册一个叫'/login'的接口,在这里我们还可以添加上一篇博文的东西,接收GET、POST的参数,这里我只写了接收URL上的参数
  7. router.on('/login',(req,res)=>{
  8. let {name,pass} = req.query;
  9. if(!users[name]){
  10. res.send({code:1,msg:'user not found!'})
  11. }else if(users[name]!=pass){
  12. res.send({code:1,msg:'username or password is wrong'})
  13. }else{
  14. res.send({code:0,msg:'success'})
  15. }
  16. res.end();
  17. })

node.js原生后台进阶(二)的更多相关文章

  1. node.js原生后台进阶(一)

    后台对于我们前端来说可能真的有点陌生,下面我来理清一下思绪吧. 一个基本的后台要求有如下功能: 1.与前端的数据交互 2.操作数据库(增删改查) 3.操作服务器文件(也大概是增删改查) 本次我们先讨论 ...

  2. Node.js原生及Express方法实现注册登录原理

    由于本文只是实现其原理,所以没有使用数据库,只是在js里面模拟数据库,当然是种中还是需要用数据库的. 1.node.js原生方法 ①html页面,非常简单,没有一丝美化~我们叫它user.html & ...

  3. 用Node.js原生代码实现静态服务器

    ---恢复内容开始--- 后端中服务器类型有两种 1. web服务器[ 静态服务器 ] - 举例: wamp里面www目录 - 目的是为了展示页面内容 - 前端: nginx 2. 应用级服务器[ a ...

  4. 使用Node.js原生API写一个web服务器

    Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...

  5. Node.js学习笔记(二):模块

    模块是 Node.js 应用程序的基本组成部分,文件和模块是一一对应的.一个 Node.js 文件就是一个模块,这个文件可能是 JavaScript 代码.JSON 或者编译过的 C/C++ 扩展. ...

  6. 使用Node.js作为后台进行爬虫

    看了一遍又一遍Node.js但是没过多久就又忘了,总想找点东西来练练手,就发现B站首页搜索框旁边的GIF图特别有意思,想着是不是可以写一个小Node.js项目把这些图全部扒下来,于是带着复习.预习与探 ...

  7. Node.js 蚕食计划(二)—— 使用 http 模块搭建 Web 服务器

    Node.js 开发的目的就是为了用 JavaScript 编写 Web 服务器程序 这次就来介绍用 http 模块搭建服务器 一.项目构建 每个 Node 程序都可以看作一个模块,而每个模块都应该有 ...

  8. node.js学习笔记(二)——回调函数

    Node.js 异步编程的直接体现就是回调. 那什么是回调呢?回调指的是将一个函数作为参数传递给另一个函数,并且通常在第一个函数完成后被调用.需要指明的是,回调函数不是由该函数的实现方直接调用,而是在 ...

  9. 编写Node.js原生扩展

    Node.js是一个强大的平台,理想状态下一切都都可以用javascript写成.然而,你可能还会用到许多遗留的库和系统,这样的话使用c++编写Node.JS扩展会是一个不错的注意. 以下所有例子的源 ...

随机推荐

  1. Accer 4752G添加固态硬盘 双系统

    (此文一直在草稿箱里躺了一年,略作修改后发布~) 背景:电脑是2011年年末买的,用到现在也已经5年多了,好在没坏过什么硬件,有过2年疯狂打LOL的经历,之后电脑就打不动了,FPS始终上不去,启动游戏 ...

  2. RabbitMQ基础教程之基本使用篇

    RabbitMQ基础教程之基本使用篇 最近因为工作原因使用到RabbitMQ,之前也接触过其他的mq消息中间件,从实际使用感觉来看,却不太一样,正好趁着周末,可以好好看一下RabbitMQ的相关知识点 ...

  3. win10引导错误的修复(内容系转载)

    #!尊重原作者,再此声明此内容属于网络转载,只是为了能保留下来方便日后查阅!!! win10误删引导文件,0xc0000098的解决方案,bcd引导文件受损情况分析 一.※相对简单的解决方法,对应的情 ...

  4. [T-ARA][놀아볼래?][要玩吗]

    歌词来源:http://music.163.com/#/song?id=22704479 作曲 : 赵英秀/김태현 [作曲 : 赵英秀/k/gim-Tae-hyeon] 作词 : 安英民 [作词 : ...

  5. Alpha版本发布时间安排

    Alpha版本发布截止时间:2014年11月23日 第一轮迭代M1报告时间:2014年11月27日课上 - 每个团队5分钟时间汇报,5分钟时间提问 第一轮迭代M1事后分析报告时间:2014年11月29 ...

  6. Linux内核分析作业 NO.1

    通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/cour ...

  7. Linux内核分析作业三

    构造一个简单的Linux系统MenuOS 复习 计算机三大法宝 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑 中断上下文的切换 进程上下文的切换 一.Linux内核源代码简介 函数目录 Lin ...

  8. Eclipse,代码中有错误,项目中却不显示红叉

    ***修改eclipse 代码提示级别1.单个项目修改项目上右键-->properties-->java compiler-->building-->enable projec ...

  9. GitHub和Microsoft TFS对比有什么优势

    GitHub变得越来越流行,最近Github发布了Github for Windows则大大降低了学习成本和使用难度,它甚至优于TFS. 微软也开始逐渐从TFS向GitHub转移了. 不是 TFS 输 ...

  10. Linux用户和用户组管理

    该内容来摘自于鸟叔的Linux私房菜. Linux的每个用户包含两个ID,一个是用户ID,一个是用户组ID.系统会根据/etc/passwd和/etc/group的设定来决定用户的访问权限.下面对用户 ...