Nodejs之基础API(三)
# Path
提供了一些工具函数,用于处理文件与目录的路径
basename、dirname与extname
- 返回一个
path的最后一部分 - 返回一个
path的目录名 - 返回
path的扩展名
const {basename,dirname,extname} = require("path");
const filePath = "/usr/local/bin/test.txt";
console.log(basename(filePath)); // test.txt
console.log(dirname(filePath)); // /usr/local/bin
console.log(extname(filePath)); // .txt
@前端进阶之旅: 代码已经复制到剪贴板
join、normalize与resolve
path.join()方法使用平台特定的分隔符把全部给定的path片段连接到一起,并规范化生成的路径path.normalize()方法会规范化给定的path,并解析'..'和'.'片段path.resolve()方法会把一个相对路径解析为一个绝对路径
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// 返回: '/foo/bar/baz/asdf'
path.join('foo', {}, 'bar');
// 抛出 'TypeError: Path must be a string. Received {}'
@前端进阶之旅: 代码已经复制到剪贴板
path.format与path.parse
path.format()方法会从一个对象返回一个路径字符串。 与path.parse()相反path.parse()方法返回一个对象,对象的属性表示path的元素
const {parse,format} = require("path");
const filePath = "/usr/local/bin/test.txt";
const parse_ret = parse(filePath);
const format_ret = format(parse_ret)
console.log(parse_ret);
console.log(format_ret);
@前端进阶之旅: 代码已经复制到剪贴板
- 结果
{ root: '/',
dir: '/usr/local/bin',
base: 'test.txt',
ext: '.txt',
name: 'test' }
/usr/local/bin\test.txt
@前端进阶之旅: 代码已经复制到剪贴板
sep、delimiter、win32、posix
和操作系统有关的东西
sep:提供了平台特定的路径片段分隔符Windows上是\POSIX上是/
path.win32提供了path方法针对Windows的实现posix属性提供了path方法针对POSIX的实现delimiter就是":"
const {sep,delimiter,win32,posix} = require("path");
const filePath = "/usr/local/bin/test.txt";
console.log("sep ",sep);
console.log("posix sep ",posix.sep);
console.log("win32 sep ",win32.sep);
console.log("PATH",process.env.PATH);
console.log("delimiter ",delimiter);
@前端进阶之旅: 代码已经复制到剪贴板
sep \
posix sep /
win32 sep \
PATH C:\Python27\;C:\Python27\Scripts;C:\Windows\system32;C:\Windows;C:\Windows\
System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Git\b
in;C:\Program Files\nodejs;;e:\Program Files\VS Code\bin;C:\Users\Administrator\
AppData\Roaming\npm;.;;.;;.;
delimiter ;
@前端进阶之旅: 代码已经复制到剪贴板
回顾小结
const path = require("path")
// 路径相关
console.log("__dirname", __dirname); //文件夹
console.log("__filename", __filename); //文件名
console.log("process.cwd()", process.cwd()); //绝对路径
console.log("./", path.resolve()); //根据相对路径取得绝对路径
@前端进阶之旅: 代码已经复制到剪贴板
__dirname、__filename总是返回文件的绝对路径process.cwd()总是返回node命令所在文件夹(就是用户在哪里启动的node脚本的路径)
# Buffer
- buffer用来处理二进制数据流的
- 类似于整数数组,大小固定
Buffer 类在 Node.js 中是一个全局变量,因此无需使用 require(‘buffer’).Buffer
// 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10)
// 创建一个长度为 10、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1);
// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);
@前端进阶之旅: 代码已经复制到剪贴板
Buffer类常用的方法
byteLength计算字符串占了几个字节Buffer.isBuffer判断是否是buffer对象Buffer.concat拼接Buffer
// byteLength 计算字符串占了几个字节
console.log(Buffer.byteLength("test")) // 4
console.log(Buffer.byteLength("测试")) // 6字节
// Buffer.isBuffer判断是否是buffer对象
console.log(Buffer.isBuffer({}))
console.log(Buffer.isBuffer(Buffer.from([1,2,3])))
// Buffer.concat拼接Buffer
const buf1 = Buffer.from("This ")
const buf2 = Buffer.from("is ")
const buf3 = Buffer.from("a ")
const buf4 = Buffer.from("test ")
const buf5 = Buffer.from("buffer")
const buf = Buffer.concat([buf1,buf2,buf3,buf4,buf5]);
console.log(buf.toString());
/**
4
6
false
true
This is a test buffer
**/
@前端进阶之旅: 代码已经复制到剪贴板
Buffer实例常用方法
buf.lengthbuf.toString()buf.fill()填充一些值buf.equals()两个buffer的内容是否相等buf.indexOf()找到字符的位置buf.copy()
const buf = Buffer.from("This is a test!");
console.log(buf.length); // 15
console.log(buf.toString("base64"));
const buf1 = Buffer.allocUnsafe(10);
// buf1.fill填充一些值
//<Buffer a0 b4 25 00 00 00 00 00 01 00>
//<Buffer a0 b4 0a 0a 0a 0a 00 00 01 00>
console.log(buf1)
console.log(buf1.fill(10,2,6)) // 从第二个开始到第六个填充10
// buf.equals两个buffer的内容是否相等
const buf2 = Buffer.from("test")
const buf3 = Buffer.from("test")
const buf4 = Buffer.from("test!")
console.log(buf2.equals(buf3)) // true
console.log(buf2.equals(buf4)) // false
// buf.indexOf() 找到字符的位置
console.log(buf2.indexOf("es")); // 1
console.log(buf2.indexOf("esa")); // -1
// 解决中文乱码问题
const StringDecoder = require("string_decoder").StringDecoder;
const decoder = new StringDecoder("utf8");
const buf5 = Buffer.from("中文字符串");
// 乱码
for (let i=0;i<buf5.length;i+=5) {
const b = Buffer.allocUnsafe(5);
buf5.copy(b,0,i);
console.log(b.toString());
}
// 不在乱码
for (let i=0;i<buf5.length;i+=5) {
const b = Buffer.allocUnsafe(5);
buf5.copy(b,0,i);
console.log(decoder.write(b));
}
@前端进阶之旅: 代码已经复制到剪贴板
# event
大多数 Node.js 核心 API 都采用惯用的异步事件驱动架构,其中某些类型的对象(触发器)会周期性地触发命名事件来调用函数对象(监听器)
eventEmitter.on()方法用于注册监听器,eventEmitter.emit()方法用于触发事件- 这和在浏览器上不同,在浏览器上靠的是用户做的一些UI的操作触发,如
click\hover
const EventEmitter = require("events");
// 继承EventEmitter类
class CustomEvent extends EventEmitter {}
const ce = new CustomEvent();
// 绑定一个事件名 test,完成事件处理程序
ce.on("test",()=>{
console.log("This is a test");
})
setInterval(()=>{
// emit触发事件
ce.emit("test");
},500)
@前端进阶之旅: 代码已经复制到剪贴板
# fs
// unlink删除文件
const fs = require("fs");
fs.unlink("./test.js",err=>{
if (err) throw err;
console.log("done");
})
@前端进阶之旅: 代码已经复制到剪贴板