内置模块
node中一些常用的内置模块:
const fs = require('fs') //处理文件
const path = require('path') //处理路径
const http = require('http') //web服务器
const buffer = require('buffer') //处理二进制数据2
3
4
path - 路径处理
path模块主要用来处理路径,主要方法如下:
const fpath = '/a/b/c/index.html'
console.log(path.dirname(fpath)) //返回路径中的目录名 /a/b/c
console.log(path.basename(fpath)) //index.html
console.log(path.basename(fpath,".html")) //index
console.log(path.extname(fpath)) //返回路径中的扩展名 .html
const basepath = "user/xxx"
const filename = 'index.html'
console.log(path.join(basepath,filename)) //user/xxx/index.html
// resolve会判断拼接的路径字符串中,是否以 / 或者 ./ 或 ../ 开头
console.log(path.resolve("user/xxx",filename)) //路径 /Users/mlive/Desktop/user/xxx/index.html
console.log(path.resolve("/user/xxx",filename)) //路径 /user/xxx/index.html
console.log(path.resolve("./user/xxx",filename)) //路径 /Users/mlive/Desktop/user/xxx/index.html
console.log(path.resolve("../user/xxx",filename)) //路径 /Users/mlive/user/xxx/index.html
console.log(path.resolve("../user/xxx","/a.text")) //路径 /a.text
console.log(path.resolve("../user/xxx","/a.text","/b.text")) //路径 /b.text2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fs - 文件处理
获取文件状态,包括文件创建时间、修改时间、文件大小、判断是文件类型(文件/文件夹)等
// 同步操作文件:代码会被阻塞,不会继续执行
const state = fs.statSync('./hello.mjs')
console.log("是否是文件夹 --->",state.isDirectory());
console.log("是否是文件 --->",state.isFile());
// 异步回调函数操作文件:代码不会被阻塞,需要传入回调函数,当获取到结果时,回调函数被执行;
fs.stat('./hello.mjs', (err, state) => {
console.log(state);
})
// 过 fs.promises 调用方法操作,会返回一个Promise,可以通过then、catch进行处理
fs.promises.stat('./hello.mjs').then(state => {
console.log(state);
}).catch(err => {
console.log(err);
})2
3
4
5
6
7
8
9
10
11
12
13
14
fs.open(path[, flags[, mode]], callback) 方法用于分配新的文件描述符。一旦被分配,则文件描述符可用于从文件读取数据、向文件写入数据、或请求关于文件的信息。
fs.open('./hello.mjs','r+',(err,fd) => {
console.log(fd);
// 通过描述符获取文件信息
fs.fstat(fd,(err,state) =>{
console.log(state);
})
})2
3
4
5
6
7
文件操作
fs.readFile(path[, options], callback):读取文件的内容,options有encoding(编码)和flag(文件操作)两个参数,encoding如果不传值,默认是buffer;
fs.readFile('./hello.mjs',(err,data) => {
console.log(data); // 获取的是<Buffer>对象,如果想直接获取字符串,需要使用toString()方法
})
fs.readFile('./hello.mjs','utf-8',(err,data) => {
console.log(data);
})2
3
4
5
6
fs.writeFile(file, data[, options], callback):在文件中写入内容;
let content = "writeFile()方法添加的内容"
fs.writeFile('./hello.mjs',content,{flag:'a+'} ,err => {
console.log(err);
})2
3
4
flag选项
flag的选项有很多值,点击查看所有值,常用的就下面几个:
w默认值,打开文件进行写入。如果不存在则创建文件,存在则清除文件。w+打开文件进行读写,如果不存在则创建文件;r打开文件读取,读取时的默认值;r+打开文件进行读写,如果不存在那么抛出异常;a打开要写入的文件,将流放在文件末尾。如果不存在则创建文件;a+打开文件以进行读写,将流放在文件末尾。如果不存在则创建文件
文件夹操作
fs.mkdir(path[, options]) 创建文件夹,如果需要先创建文件夹,再做一些其他事情,使用fs.mkdirSync(path[, options])函数;
const dirname = "nodeDemo"
//判断文件夹是否存在
if (!fs.existsSync(dirname)) {
fs.mkdir(dirname,err => {
console.log(err);
})
}2
3
4
5
6
7
fs.rename(oldPath, newPath, callback)修改文件夹名称
const dirname = "nodeDemo"
fs.rename('nodeDemo','renameDemo',err => {
console.log(err);
})2
3
4
fs.readdir(path[, options], callback) 读取文件夹内所有文件
import fs from 'fs'
import path from 'path'
function readFolders(folder){
// withFileTypes:true,返回的files是文件夹对象,而不是文件名
fs.readdir(folder,{withFileTypes:true},(err,files) =>{
files.forEach(file => {
if (file.isDirectory()) {
const newFolder = path.resolve(folder,file.name)
readFolders(newFolder)
}else{
console.log(file.name);
}
})
})
}
readFolders('./boomswift')2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
events
Node中的核心API都是基于异步事件驱动的,在这个体系中,某些对象(发射器(Emitters))发出某一个事件。我们可以监听这个事件(监听器 Listeners),并且传入的回调函数,这个回调函数会在监听到事件时调用。
emitter.on(eventName, listener):监听事件,也可以使用addListener;
emitter.off(eventName, listener):移除事件监听,也可以使用removeListener;
emitter.emit(eventName[, ...args]):发出事件,可以携带一些参数;
import EventEmitter from 'events'
const bus = new EventEmitter()
bus.on('click',(args) =>{
console.log(args);
})
bus.emit('click',{name:'beijing'})
bus.emit('click',{name:'beijing'})
bus.removeListener('click')2
3
4
5
6
7
8
9
常见属性
import EventEmitter from 'events'
const bus = new EventEmitter()
console.log(bus.eventNames()); //返回当前 EventEmitter对象注册的事件字符串数组;
console.log(bus.getMaxListeners()); // 返回当前 EventEmitter对象的最大监听器数量,可以通过setMaxListeners()来修改,默认是10;
console.log(bus.listenerCount('event')); // 返回当前 EventEmitter对象某一个事件名称,监听器的个数;
console.log(bus.listeners('event')); // 返回当前 EventEmitter对象某个事件监听器上所有的监听器数组;2
3
4
5
6
7