Node常用内置模块

更多内容去查看官方文档

一,path

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 1. resolve:路径拼接,避免在不同操作系统的路径符号问题,如'/和\'
const path = require('path')
const basePath="\\user\\why"
const fileName="abc.txt"
const filePath=path.resolve(basePath,fileName)
console.log("1. "+filePath);

// 2. 路径信息
// 获取文件路径
console.log("2. "+path.dirname(filePath));
// 获取文件名
console.log("2. "+path.basename(filePath));
// 获取文件后缀名
console.log("2. "+path.extname(filePath));

// join:路径拼接
console.log("3. "+path.join(basePath,fileName))

image-20210917193128602

二,File System

文件的API大多数都提供三种操作方式,一般都有promises方法

  1. 同步操作文件:代码会被阻塞,不会继续执行
  2. 异步回调函数操作文件:代码不会被阻塞,需要传入回调函数,当获取到结果时,回调函数被执行
  3. 异步Promise操作文件:代码不会被阻塞,通过 fs.promises 调用方法操作,会返回一个Promise, 可以通过then、catch进行处理

1. 三种使用方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const fs=require('fs')
// 1. 读取文件信息
const filePath=('./a.txt')

// 方式一:同步操作
const info=fs.statSync(filePath)
// console.log('后续需要执行的代码');
// console.log(info);

// 方式二:异步操作
fs.stat(filePath,(err,info)=>{
if(err){
console.log(err);
return
}
console.log(info);
})
console.log('因为没阻塞,所以先执行了下面的代码');

// 方式三:promise
fs.promises.stat(filePath).then(info=>{
console.log(info);
}).catch(err=>{
console.log(err);
})

2. 文件描述符

https://baike.baidu.com/item/%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6/9809582?fr=aladdin

3. 文件读写

  • w 打开文件写入,默认值;
  • w+打开文件进行读写,如果不存在则创建文件;
  • r+ 打开文件进行读写,如果不存在那么抛出异常;
  • r打开文件读取,读取时的默认值;
  • a打开要写入的文件,将流放在文件末尾。如果不存在则创建文件;
  • a+打开文件以进行读写,将流放在文件末尾。如果不存在则创建文件
1
2
3
4
5
6
7
8
9
10
11
12
13
const fs = require('fs')

// 1. 文件写入
const content="你好呀,小叶子"
const appen="我们有机会嘛"
fs.writeFile('./a.txt',appen,{flag:"a"},err=>{
console.log(err);
})

// 2. 文件读取 默认读出来的是buffer
fs.readFile("./a.txt",{encoding:'utf-8'},(err,data)=>{
console.log(data);
})

4. 文件夹操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const fs = require('fs')
const path=require('path')

// 1. 创建文件夹
const dirname='./why'
if(!fs.existsSync(dirname)){
fs.mkdir(dirname,err=>{
console.log(err);
})
}

// 2. 读取文件夹中所有文件
fs.readdir(dirname,(err,files)=>{
console.log(files);
})

// 读取当前文件夹下所有文件,通过递归的方式
function getFiles(dirname){
fs.readdir(dirname,{withFileTypes:true},(err,files)=>{
for(let file of files){
if(file.isDirectory()){
const filepath = path.resolve(dirname,file.name)
getFiles(filepath)
}else{
console.log(file.name);
}
}
})
}
getFiles(dirname)

5. 写node脚本的注意点

  • 传值:使用process.argv[x]来读取传入的参数
  • .padStart(2,0):这个方法可以补齐0 ,如01,02

三,event模块

类似人体的反应,比如手摸火,手发射事件,大脑监听做出已经设置好的反应。

  • Node中的核心API都是基于异步事件驱动的
    • 在这个体系中,某些对象(发射器(Emitters))发出某一个 事件
    • 我们可以监听这个事件(监听器 Listeners),并且传入的回 调函数,这个回调函数会在监听到事件时调用
  • 发出事件和监听事件都是通过EventEmitter类来完成的,它们都属 于events对象
    • emitter.on(eventName, listener):监听事件,也可以使用 addListener
    • emitter.off(eventName, listener):移除事件监听,也可以使 用removeListener
    • emitter.emit(eventName[, …args]):发出事件,可以携带一 些参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const EventEmitter=require('events')

// 1. 创建发射器
const emitter = new EventEmitter()

// 2. 监听某一个事件 addListener 是on的alias简写
emitter.on('click',(args)=>{
console.log('监听1到click事件',args);
})
const lis2=(args)=>{
console.log('监听2到click事件',args);
}
emitter.on('click',lis2)

// 3. 发出一个事件
setTimeout(()=>{
emitter.emit('click','露西','艾尔莎')
// 取消
emitter.off('click',lis2)
emitter.emit('click','露西','艾尔莎')
},1000)