服务端 | Nodejs 学习笔记(一)
Node.js

前言:
  2009年面世
   nodejs.org 官网
   https://www.npmjs.com/     模块社区
   github.com 仓库
   stackoverflow.com  问答社区
  基于chrome浏览器V8引擎、C++语言编写的,本质上是Js的运行环境;
  可以解析js代码;
  提供系统级别的api:
     1、文件的读写
     2、进程的管理
     3、网络通信
安装:
  linux 上安装nodejs
  mac 上安装node:
     升级到mac系统到最新;
     下载安装 xcode 集成开发环境; 
      xcode-select -p 检查是否安装了xcode 如果返回一个路径,说明已经安装了;如果没有安装
      xcode-select --install 
   安装python;
   安装homebrew 「是针对Mac下的套件管理器,相当于ubuntu下的apt-get,相当于CentOS下的yum
     homebrew 依赖于 ruby,如果安装不成功,尝试升级ruby版本;
      brew install node mongodb
    node -v
   安装 node 版本管理工具 n
    npm install -g n
      n的使用 
       n 0.10.22
       n 
-- 用 nodejs 创建一个服务器;
本质上是一个 javascript 的执行环境,只不过加上封装、web底层的处理,赋予了更多的能力;
保存为server.js
 const http = require('http'); // 加载http模块,这个模块是由js编写的;指责是创建服务器,处理 http 相关任务
 const hostname = '127.0.0.1';
 const port = ;
 const server = http.createServer((req, res) => {
 // 通过 createServer 创建一个web服务器,有请求从监听的端口过来时,调用里边匿名的回调函数;req用来获取这次请求相关的信息,res告诉服务器,响应一些内容;
   res.statusCode = ;
   res.setHeader('Content-Type', 'text/plain');
   res.end('Hell Frank,fighting ! \n');
 });
 server.listen(port, hostname, () => { // 让服务器在端口上监听请求;服务器就 ready 了,就可以收到任何来自3000端口的请求
   console.log(`Server running at http://${hostname}:${port}/`);
 });
node server.js // 执行
浏览器刷新 http://127.0.0.1:3000/
Nodejs 环境 和 浏览器的执行环境的异同:
(1)都可以正常的执行 js 代码
(2)宿主 浏览器是 window; node中没有 window document,有process http 等模块,但是浏览器没有
Node.js 的模块 与 Commonjs规范:
之前的http 和 process 都是nodejs的模块;
页面中有大量js引入时,尤其是有相互依赖的情况下,很容易被覆盖掉,方法被重写了,js天生缺少一种模块管理机制,来隔离实现不同功能的js片段,避免他们相互污染;
为此我们经常采用命名空间的方式,把变量和函数限制到某个特定的作用域内,人肉约定一套命名规范来约束代码,从而保障代码的安全执行,比如jQuery中,有许多的变量和方法,必须通过$调用;
commonjs 并不像 jquery 是一套具体实现某功能的库,他是一套规范,包括模块、包、系统、二进制、单元测试等等,来约定 javascript 怎么来组织,怎么编写,同时大部分标准也是在拟定和讨论之中的;
首先把执行不同任务的代码块看做成一个独立的模块,每一个模块看作成一个独立的作用域,但并不是孤立的,可能存在某种依赖关系,对于一个模块可以分成三个部分:模块的定义、模块的标示、模块的引用;js规范。
Nodejs借鉴 commonjs 模块组织的理念,实现了一套模块管理系统;
模块的分类:
   核心模块、本地模块、第三方模块;
Nodejs API
url.parse() 解析url:
url.format()
url.resolve()
querystring 解析参数:
querystring.stringfy({name: 'frank', age: 19}) 将参数对象序列化解析为参数字符串,默认用=链接key alue,&;
querystring.parse() 将参数对象反序列化;三个参数('', ',' , ':' , 0)
querystring.escape(str) 参数转译
querystring.unescape() 参数反转译
http 知识填坑:
网络通信协议,http客户端发起请求,创建端口;http服务器在端口监听客户端请求;http服务器向客户端返回状态信息和内容;
(1)浏览器输入url,接下来发生了什么。。。
-1-、chrome浏览器搜索自身的DNS缓存,看看自己的DNS缓存有没有 baidu.com 对应的ip地址缓存,或缓存有没有过期,该缓存有效时间约 1 分钟;
「chrome://net-internals/#dns 可查看浏览器dns缓存」
-2-、如没有,搜索操作系统自身的DNS缓存;
-3-、如没有,读取本地 host 文件,找是否有 DNS 的配置项;
-4-、如没有,浏览器发起一个 DNS 的系统调用,向宽带运营商发起域名解析请求;
「 宽带运营商服务器查看本身缓存,看是否有配置项,是否过期,
如果没有,运营商服务器 代替浏览器发起一个迭代DNS解析请求 ---> 万网等域名服务上返回 ip 地址,
运营商服务器把返回的结果 -> 返回操作系统内核并缓存起来,操作系统内核把结果返回给浏览器,浏览器拿到了对应的ip地址,域名解析完成。
-5-、浏览器获得域名对应的 ip 地址后,发起经典的 HTTP “三次握手”;「TODO」
「浏览器向服务器发起TCP连接请求,通过层层路由设备到达服务器端的网卡,然后进入到服务器内核的 TCP/IP 协议栈,经过防火墙的过滤,建立起TCP/IP连接;」
-6-、 建立起 TCP/IP 连接之后,浏览器就可以向服务器发送 HTTP 请求了,
-7-、 服务器接收请求后,根据路径参数,经过后端的一些处理之后,把处理的结果返回给浏览器,浏览器进行渲染出页面;
(2)请求方法:
GET : 读取;POST:提交数据; PUT:更新信息;DELETE:删除;HEAD;TRACE;
(3)状态码:
1xx : 请求已经发出,正在处理
2xx : 成功接受 「200 客户端请求成功」
3xx : 需要重定向 : TODO
4xx : 客户端错误:
400 客户端语法等错误,服务器不能理解
401 请求没有经过授权」「服务器收到请求,拒绝服务,可能是没有权限等」「请求资源不存在,也可能是url错了」
5xx : 服务器端的错误: 「500服务器发生了不可预期的错误」「服务器当前不能处理该请求,可能过一段时间会恢复正常」
(4)https 协议
    
https 是基于 http,在 http 基础上增加了 SSL/TLS 握手、数据加密传输;
专门用于处理加密访问;
搭建https服务器时需要ssl证书;
创建 https 服务器:
    
Node HTTP 模块:
(1)回调:
回调是异步编程最基本的方法,对于nodejs,需要按照顺序执行异步逻辑时,采用后续传递的方式,将后续逻辑封装在回调函数中作为起始函数的参数,逐层嵌套;
(2)同步 异步:
同步就是执行一个任务,后一个任务等待前一个任务完成后开始执行,程序的执行顺序与任务的排列顺序有关;
js中经典的异步: setTimeout setInterval
(3)I/O 磁盘的读入 输出:
(4)单线程 / 多线程:
(5)阻塞 / 非阻塞:
(6)事件: 浏览器中鼠标的点击,拖拽窗口,
(7)事件驱动:
(8)基于事件驱动的回调:
(9)事件循环: eventloop 是个回调函数队列,单线程,先进先出
关于“作用域” “上下文” 填坑:
- 作用域:和调用函数、访问变量的能力有关;局部作用域可以访问全局作用域的变量和函数,全局的访问不到局部的;
- 上下文: this 关键字有关,是调用当前可执行代码的引用;
「上下文代表 this 变量的值和指向,决定一个函数被怎么调用,当一个函数被作为一个对象的方法调用的时候,this总是指向调用这个方法的对象; 」
「JS中,this 表示当前函数的拥有者,通常把拥有者叫作“执行上下文”;
this 是 js 的关键字,是函数运行时自动生成的内部对象;只能在函数内部使用;
对于函数的上下文执行对象,需要依据当前的运行环境而定,在全局运行的上下文中,this指向全局对象,在函数内部,this取决于函数被调用的方式:如下
 「 this指向pat对象;」
 「 this指向pat对象;」
       「 全局调用,this指向全局对象,浏览器:window;node环境指向 global 」
 「 全局调用,this指向全局对象,浏览器:window;node环境指向 global 」
       「 构造函数中使用this,this指向新购建好的对象,实例对象;」
 「 构造函数中使用this,this指向新购建好的对象,实例对象;」
JS的函数存在概念:定义时的上下文,运行时的上下文,上下文是可以改变的。函数的方法 call() apply() 可以改变上下文执行对象,可以在自定义上下文中执行函数
       「 运行时改变上下文:通过call 改变this上下文,在调用时,将 this 指向dog,实现继承;」
 「 运行时改变上下文:通过call 改变this上下文,在调用时,将 this 指向dog,实现继承;」
       「 定义时改变上下文:这种方法不是执行是改变this指向,定义时已经改变了指向;」
 「 定义时改变上下文:这种方法不是执行是改变this指向,定义时已经改变了指向;」
event事件:
node 事件没有冒泡、捕获等;
var EventEmitter =  require('events').EventEmitter
var life = new EventEmitter()
life.setMaxListeners(11) // 默认监听不超过10个,否则报 warning
life.on('eventname', function (who) { // 此时 on 可以用 addEventListener 替换
  console.log('给' + who+ '倒水')
})
lief.emit('eventname', '汉子') 
lief.emit('eventname', '汉子') 返回一个布尔值,true,说明事件被监听过;
Promise
异步的解决方案:
(1)回调
(2)事件机制
(3)对事件增加事件监听,对某个异步操作增加异步触发,
(4)订阅者发布者 的 观察者模式
(5)promise
Promise A 与 Promise A+规范:
  
promise库:bluebird
promise重构网站爬虫:「待续」
  
Nodejs 中的网络模块 - NET:
互联网的价值基础是数据传送,一起都围绕数据展开,比如发送、接受等,但这一切都离不开网络;http、https都是建立在 NET 模块之上的;
Buffer :缓冲,在Nodejs中处理二进制的数据,Buffer的存在是因为,javascript的字符串是以 utf-8 编码格式存储的,处理二进制的能力是很弱的,而网络层对于资源的存储请求等都是以二进制的格式交互的,所以 Nodejs 就有 Buffer 这个接口,来创建专门存放二进制数据的缓存区,并且提供给了一些方法对于这些数据进行进一步的处理;
Buffer 在 Nodejs 中是可以直接访问的,不需要 require 来加载,Buffer 有一些静态方法,可以实例化,实例化之后的对象上有相应的属性和方法;
生成实例的方法(1)new (2)传入一个size,以字节数为单位,传递给构造函数,生成一段内存区间; (3)通过数组初始化;
(1)通过new实例化
  
Buffer 是个对象,也是一个构造函数,具有自己的属性和静态方法;
通过它new出来的实例,其实是V8引擎分配的一段内存;基本上是数组,成员都是整数值;
  
Buffer对象与字符串相互转换过程是需要指定编码格式的,默认是 utf-8;
  
(2)传入一个size,以字节数为单位,传递给构造函数,生成一段内存区间
   length属性表示缓存区的大小,写入内容超出长度的部分是不会被缓冲的,如下:
  length属性表示缓存区的大小,写入内容超出长度的部分是不会被缓冲的,如下:
  
(3)通过数组实例化,实例化后可以通过下标来访问某一个值;数组的一个某一项如果为小数,访问到的也只是整数
  
- Buffer 实例的方法 -
  
- stream 流-
事件驱动,可控制;
Readable 可读流 -- > 读取外部的数据,并吧读到的数据缓存到内部的 Buffer 数组中;
Writable 可写流 -- > 负责消费数据,从可读流中获取数据,从获取到的 trunk 数据块进行处理;
Duplex --
Transform -- 转换流
eg:
  
定制可读流、定制可写流、定制转换流,并且实现他们的内置接口;
  
  
  
服务端 | Nodejs 学习笔记(一)的更多相关文章
- nodejs服务端开发学习笔记
		正在学习中,不断改错... 学习了一段时间nodejs,对其中的很多东西还不是很理解,在网上看过很多的例子,希望通过自己的一些总结让自己了解的更全面些,同时也作为学习笔记留存备忘. 准备工作 node ... 
- node服务端搭建学习笔记
		咳咳,终于迈出这一步了...这篇文章将是边学边写的真正笔记...用于mark下学习过程中的点滴~ 开篇先把我学习参考的文章来源给出,以表示对前人的尊敬: https://github.com/nswb ... 
- NodeJS学习笔记 进阶 (1)Nodejs进阶:服务端字符编解码&乱码处理(ok)
		个人总结:这篇文章主要讲解了Nodejs处理服务器乱码及编码的知识,读完这篇文章需要10分钟. 摘选自网络 写在前面 在web服务端开发中,字符的编解码几乎每天都要打交道.编解码一旦处理不当,就会出现 ... 
- Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识
		目录 前言 新建express项目并自定义路由规则 如何提取页面中的公共部分? 如何提交表单并接收参数? GET 方式 POST 方式 如何字符串加密? 如何使用session? 如何使用cookie ... 
- Nodejs学习笔记(六)—Node.js + Express 构建网站预备知识
		前言 前面经过五篇Node.js的学习,基本可以开始动手构建一个网站应用了,先用这一篇了解一些构建网站的知识! 主要是些基础的东西... 如何去创建路由规则.如何去提交表单并接收表单项的值.如何去给密 ... 
- Nodejs学习笔记(四)——支持Mongodb
		前言:回顾前面零零碎碎写的三篇挂着Nodejs学习笔记的文章,着实有点名不副实,当然,这篇可能还是要继续走着离主线越走越远的路子,从简短的介绍什么是Nodejs,到如何寻找一个可以调试的Nodejs ... 
- Nodejs学习笔记(二)——Eclipse中运行调试Nodejs
		前篇<Nodejs学习笔记(一)——初识Nodejs>主要介绍了在搭建node环境过程中遇到的小问题以及搭建Eclipse开发Node环境的前提步骤.本篇主要介绍如何在Eclipse中运行 ... 
- NodeJS学习笔记 进阶 (12)Nodejs进阶:crypto模块之理论篇
		个人总结:读完这篇文章需要30分钟,这篇文章讲解了使用Node处理加密算法的基础. 摘选自网络 Nodejs进阶:crypto模块之理论篇 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速 ... 
- go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])
		目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ... 
随机推荐
- 杭电 1012 u Calculate e【算阶乘】
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1012 解题思路:对阶乘递归求和 反思:前面3个的输出格式需要注意,可以自己单独打印出来,也可以在for ... 
- eclipse tomcat发布路径在哪?
- centos7 修改默认语言
			vi /etc/locale.conf # 修改成英文 LANG="en_US.UTF-8" # 修改成中文 LANG="zh_CN.UTF-8" 
- linux--ubuntu的下载以及VMware Tool的安装
			1. Ubuntu的下载:http://cn.ubuntu.com/download/ 2. VMware Tool的安装: 第一步:在主机上,从 Workstation Pro 菜单栏中选择虚拟机 ... 
- Python爬虫4------图片爬虫
			import urllib.request import re keyname="短裙" key=urllib.request.quote(keyname) headers=(&q ... 
- 01.Python基础-4.字符串
			1 字符串初识 字符串编码 字符串定义:多个字符(双引号或单引号中的数据)组成 字符串下标 类似列表list 格式化 就是占位符 最常用%s %d %f等等 转义字符 转义字符 描述 \ (在行尾时) ... 
- Linux设备驱动--块设备(一)之概念和框架(转)
			基本概念 块设备(blockdevice) --- 是一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,他使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入设备或者从设备一次性 ... 
- Jquery学习总结(5)——jQuery选择器
			1. #id : 根据给定的ID匹配一个元素 <p id="myId">这是第一个p标签</p> <p id="not">这 ... 
- Sping面试题分析
			1.开放中主要使用Spring的什么技术? (1)IOC容器管理各层的组件 (2) 使用AOP配置声明式事务 (3)整合其他框架 2简述AOP和IOC概念 AOP : Aspect Orienten ... 
- hdu   4079简单贪心
			#include<stdio.h> #include<string.h> #define ll __int64 #define N 11000 struct node { in ... 
