nodejs三大特点:非阻塞I/O、单线程、事件驱动。
非阻塞I/O的异步API
1、定时器:一次性定时器(setTimeout)和周期性定时器(setInterval)。缺点:时间不够精确,使用定时器会动用红黑树,浪费性能。
2、process.nextTick():轻量高效的方法,属于idle观察者
3、setImmediate():该方法属于check观察者,process.nextTick()的回调函数执行的优先级高于setImmediate()的回调函数,原因是idle观察者先于I/O观察者,I/O观察者先于check观察者。
进程和线程
进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。
一个程序至少一个进程,一个进程至少一个线程,这个线程就是主线程。
线程的执行顺序
1、把主线程的内容放到子线程启动之后去执行,就会出现主线程和子线程轮流抢占CPU执行权的情况。
2、当主线程的内容执行完毕后,就开始创建并启动子线程,会看到创建的子线程轮流抢占CPU的执行权。
创建服务器
// 创建服务器
// 引入http模块
var http = require(“http”);
// 通过http创建服务对象
var server = http.createServer(function (req,res) {
console.log("客户端向服务器发送请求的地址是: " + req.url);
res.writeHead(200,{“Content-Type”:“text/plain”});
res.end(“Hello Everybody! Welcome to Lanou!”);
});
server.listen(1234,“127.0.0.1”);
console.log(“server is running…”);
管道输入输出
// 使用管道 pipes
var http = require(“http”);
var fs = require(“fs”);
// 创建读取流对象
var myReadStream = fs.createReadStream(__dirname + “/readMe.txt”);
// 创建写入流对象
var myWriteStream = fs.createWriteStream(__dirname + “/writeMe.txt”);
// 读取流对象调用pipe,输出到写入流文件中
// myReadStream.pipe(myWriteStream);
// 1.用户访问服务器 127.0.0.1:3333
// 2.创建本地服务器
// 3.使用服务对象监听 127.0.0.1:3333 地址
// 4.在服务回调函数中,写响应头
// 5.将readMe.txt中的内容读取出来,并且输出到请求的浏览器页面中
// 创建服务器
var server = http.createServer(function (req,res) {
// console.log("地址: " + req.url);
res.writeHead(200,{“Content-Type”:“text/plain”});
myReadStream.pipe(res);
});
server.listen(3333,“127.0.0.1”);
console.log(“server is running…”);
restful-API
REST即表述性状态传递,表述性状态转移是一组架构约束条件和原则。
HTTP 方法:
以下为 REST 基本架构的四个方法:
GET - 用于获取数据。
PUT - 用于更新或添加数据。
DELETE - 用于删除数据。
POST - 用于添加数据。
偏函数和高阶函数
高阶函数:把函数作为参数或者返回一个函数的函数。比如闭包,map方法
偏函数:通过指定部分参数来产生一个新的定制函数的形式。
Buffer
Buffer是一个像Array的对象,主要用于操作字节。Buffer的作用是处理大量的二进制数据,而JavaScript自有的字符串不能满足大量处理数据(比如图片、文件、操作数据库等)的能力。node在启动的时候就已经加载Buffer了,所以不用再次require。
Buffer对象是一个类数组,它的元素为16进制的两位数,即从0-255的数值。
var str = “好好学习天天向上”;
var buf = new Buffer(str);
console.log(buf);
console.log(buf.length);//Buffer有length属性
console.log(buf[0]);//Buffer可以像数组一样用下标来取值
buf[30] = 200;//可以给Buffer来赋值
赋值小于0,则逐次加256;大于255,逐次减256,直到得到一个0-255范围内的值
Buffer对象的内存分配不在V8的堆内存中,而在node的C++层面实现的内存申请。
node 以8KB来区分Buffer是大对象还是小对象。
Buffer的拼接使用的是:Buffer.concat()函数