跳到主要内容

Node

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,是一个应用程序。

安装完成后,在 CMD 命令行窗口下运行 node -v,如显示版本号则证明安装成功,反之安装失败,重新安装。

注意:

nodejs 环境下,不能使用 BOMDOM ,也没有全局对象 window,全局对象的名字叫 global

作用: 解析运行JS代码,操作系统资源,如内存、硬盘、网络。

应用场景

  • APP 接口服务
  • 网页聊天室
  • 动态网站, 个人博客, 论坛, 商城等
  • 后端的Web服务,例如服务器端的请求(爬虫),代理请求(跨域)
  • 前端项目打包(webpack, gulp)

Buffer(缓冲器)

Buffer 是一个和数组类似的对象,不同是 Buffer 是专门用来保存二进制数据的

特点:

  • 大小固定:在创建时就确定了,且无法调整
  • 性能较好:直接对计算机的内存进行操作
  • 每个元素大小为 1 字节(byte)

创建Buffer

  • 直接创建 Buffer.alloc
  • 不安全创建 Buffer.allocUnsafe
  • 通过数组和字符串创建 Buffer.from
//Buffer 的声明创建
const buf_1 = Buffer.alloc(10);
const buf_2 = Buffer.allocUnsafe(10);
const buf_3 = Buffer.from('hello world');//from 来自
console.log(buf_1);
console.log(buf_2);
console.log(buf_3);

//Buffer内容的读取和设置
//获取第一个字节的内容
console.log(buf_3[0]);

//通过数字获取对应的ASCII字符
console.log(String.fromCharCode(105));
//通过ASCII获取对应的编号
console.log('a'.charCodeAt());
//将Buffer转换为字符串
console.log(buf_3.toString());

//设置
buf_3[0] = 99;
console.log(buf_3.toString());

//获取buffer存储对应的字符串表示

//关于溢出 舍去高于8位的内容 0001 0010 1100 ==> 0010 1100 ==>
buf_3[0] = 300;
console.log(buf_3);
console.log(buf_3.toString());

//关于中文,一个UTF-8中文字符占据三个字节
const buf_4 = Buffer.from('我爱你');
console.log(buf_4);

//字符集

Buffer读取和写入

  • 可以直接通过 [] 的方式对数据进行处理,可以使用 toString 方法将 Buffer 输出为字符串
  • []buffer 进行读取和设置
  • toString() 将 Buffer 转化为字符串

关于溢出: 溢出的高位数据会舍弃。

关于中文: 一个 UTF-8 的中文字符大多数情况都是占 3 个字节。

关于单位换算:

  • 1Bit 对应的是 1 个二进制位
  • 8 Bit = 1 字节(Byte)
  • 1024Byte = 1KB
  • 1024KB = 1MB
  • 1024MB = 1GB
  • 1024GB = 1TB
  • 平时所说的网速 10M 20M 100M 这里指的是 Bit ,所以理论下载速度 除以 8 才是正常的理解的下载速度

文件系统 fs

fs 全称为 file system,是 NodeJS 中的内置模块,可以对计算机中的文件进行增删改查等操作。

如何判定回调的执行是同步还是异步的? 尝试在回调中进行内容输出, 然后在回调后也进行输出, 然后对比。

关于同步API与异步 API的选择:

  • 如果要做服务, 需要使用『异步』
  • 如果做文件相关的处理, 不涉及为用户提供服务, 可以使用同步API(简单写入, 读取)

文件写入

需要持久化保存数据的时候,需要想到文件写入。

对于简单的写入次数较少的情况, 可以使用 writeFile , 如果是批量要写入的场景,使用 createWriteStream

简单写入

  • fs.writeFile(file, data, [,options], callback);
  • fs.writeFileSync(file, data);
  • options 选项
    • encoding 默认值: 'utf8'
    • mode默认值: 0o666
    • flag 默认值: 'w'

流式写入

  • fs.createWriteStream(path[, options])
    • path
    • options
      • flags 默认值: 'w'
      • encoding 默认值: 'utf8'
      • mode 默认值: 0o666
    • 事件监听 open close eg: ws.on('open', function(){});
//1、引入fs
const fs = require('fs');

//2、创建写入流对象
const ws = fs.createWriteStream('./home.html');

//3、执行写入
ws.write('巧合是上帝默默操控世界的方式。');
ws.write('聆听雨落的声音,俯看凋零的落叶。伫细雨之中,感雨落之殇。');

//4、关闭写入流
ws.close();

写入文件场景

  1. 下载文件
  2. 安装文件
  3. 日志(程序日记) 如 Git
  4. 数据库
  5. 网盘
  6. 编辑器保存文件
  7. 视频录制

文件读取

简单读取

  • fs.readFile(file, function(err, data){})
  • fs.readFileSync(file)

流式读取 fs.createReadStream();

//1、引入fs模块
const fs = require('fs');

//2、创建读取流对象
const rs = fs.createReadStream('./index.html');

//3、绑定事件 when 当...时候
//chunk 块 当读取完一块数据后触发
rs.on('data', chunk => {
console.log(chunk.toString());
});

//读取流打开的时候触发
rs.on('open', () => {
console.log('读取流打开了');
})

rs.close();
json读取
//1、引入模块
const fs = require('fs');

//2、读取
fs.readFile('data.json', (err, data) => {
if (err) throw err;
//将Buffer转换为字符串,并赋值给一个变量
let str = data.toString();
//将字符串转换为对象
let dataJSON = JSON.parse(str);
console.log(dataJSON);
})
提示

对于小文件读取和处理 readFile
对于大文件读取 createReadStream

读取文件场景

  1. 下载文件
  2. 程序运行
  3. 数据读取(数据库)
  4. 日志 (git log)
  5. 编辑器打开文件

文件删除

  • fs.unlink('./test.log', function(err){});
  • fs.unlinkSync('./move.txt');

移动文件 + 重命名

  • fs.rename('./1.log', '2.log', function(err){})
  • fs.renameSync('1.log','2.log')

文件夹操作

  • mkdir 创建文件夹
    • path
    • options
      • recursive 是否递归调用
      • mode 权限 默认为 0o777
    • callback
  • rmdir 删除文件夹
  • readdir 读取文件夹

附录

unicode 字符集