Node笔记二(基础API)

本文详细介绍了Node.js中path模块的使用方法,包括路径规范化、拼接、解析及获取文件名、目录名和扩展名等功能;并通过示例展示了Buffer对象处理二进制数据流的方式;同时介绍了EventEmitter类的基本用法,包括事件的监听、触发和移除;最后讲解了fs模块进行文件系统操作的常见方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

资源

各种进阶资源 + 联系方式请看下方链接
资源
以下仅仅是自己笔记 想看详细的请移步官方中文文档

normalize
  • 对文件路径的处理
const {normalize} = require('path')
console.log(normalize('/Users/zyunl//Desktop/node/../argv.js'))
输出 \Users\zyunl\Desktop\argv.js
//可以看到输入的路径有 // 也帮我们处理成 / 如果有/../会提到上一层
join
  • 拼接的意思 把几个字符串拼接成路径 也可以识别…/ 也可处理 /user/,/bin/这种两边都带斜线的情况
const {join} = require('path')
console.log(join('/user','local','bin/'));
console.log(join('/user','../local','bin/'));
输出
\user\local\bin\
\local\bin\
resolve
  • 可以把输入的相对路径解析为绝对路径
const {resolve} = require('path')
console.log(resolve('./'));
输出 C:\Users\zyunl\Desktop\node
basename dirname extname
  • basename:文件名
  • dirname:所处路径
  • extname:扩展名
const {basename,dirname,extname} = require('path');
const filePath = '../小程序/bduan/static/image/add.png';
console.log(basename(filePath));
console.log(dirname(filePath));
console.log(extname(filePath));
输出
add.png //basename
../小程序/bduan/static/image //dirname
.png //extname
parse format
  • parse的作用是把一个路径分解为一个对象内的多个参数 format作用是恢复parser的对象 变成路径 当想对一个路径进行增删改操作的时候 可以用parse操作对象内的属性然后用format合并 更方便
  • 需要注意的是 format从一个对象返回字符串时 有些属性的优先级比其他更高
  1. 如果提供了pathObject.dir 则 pathObject.root 会被忽略
  2. 如果提供了pathObject.base存在 则pathObject.ext 和 pathObject.name会被忽略
sep delimiter win32 posix

要在任何操作系统上使用 POSIX 文件路径时获得一致的结果,则使用 path.posix:(转为苹果)
要在任何操作系统上使用 Windows 文件路径时获得一致的结果,则使用 path.win32:

//当前是windows系统 所以win32没啥用
const {sep,delimiter,win32,posix} = require('path')
console.log('sep:',sep);
console.log('win sep:',win32.sep);
console.log('path:',process.env.PATH);
console.log('delimiter:',delimiter);
console.log('win delimiter:',win32.delimiter);
输出
sep: \
win sep: \
path: C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\nodejs\;C:\Program Files\Git\cmd;C:\Program Files\TortoiseSVN\bin;C:\Program Files\Java\jdk1.8.0_121\bin;C:\Users\zyunl\AppData\Roaming\npm;C:\Users\zyunl\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\zyunl\AppData\Local\BypassRuntm
delimiter: ;
win delimiter: ;
path返回总结
  • _dirname、_filename总是返回文件的绝对路径
  • process.cwd()总是返回执行node命令所在的文件夹
./的情况
  • 在require方法中总是相对于当前文件所在的文件夹
  • 在其他地方和process.cwd()一样,相对于node的启动文件夹
Buffer
  • Buffer是用来处理二进制数据流
  • 实例类似整数数组,大小固定
    -使用C++代码在V8堆外分配物理内存
Buffer的常用方法
console.log(Buffer.alloc(10))
//输出<Buffer 00 00 00 00 00 00 00 00 00 00>

console.log(Buffer.alloc(5,1))
//输出<Buffer 01 01 01 01 01>

console.log(Buffer.allocUnsafe(5,1))
//不安全 没有初始化 数额随机
//输出<Buffer 28 67 38 00 00>

console.log(Buffer.from([1,2,3]))
//输出<Buffer 01 02 03>

console.log(Buffer.from('test'))
//输出<Buffer 74 65 73 74>二进制编码

console.log(Buffer.from('test','base64'))
//输出base64形式的编码<Buffer b5 eb 2d>

const buf = Buffer.from('This is a test')
console.log(buf.length)
//如果是from申请的空间 那么用多少空间就占多少 此处是14

console.log(buf.toString('base64'))
//如果不传入任何东西 那么默认就是utf-8 现在传入了base64
//输出VGhpcyBpcyBhIHRlc3Q=

const buf3 = Buffer.allocUnsafe(10)
console.log(buf3)
console.log(buf3.fill(10,2,6))
//输出<Buffer 90 d5 16 00 00 00 00 00 00 00>
//<Buffer 90 d5 0a 0a 0a 0a 00 00 00 00>
//从第二位到第六位 都是0a 是16进制的

console.log(buf.equals(buf3))
//这是判断两个buf是否相等此处返回false

console.log(buf.indexOf('es'))
//如果存在返回下标 这里是11 如果不存在返回-1
const StringDecoder = require('string_decoder').StringDecoder 
const decoder = new StringDecoder ('utf8')
decoder.write(需要打印的buffer)
events(事件)
  • node两个核心特性
    1. 事件驱动
    2. 异步I/O
  • 当主进程遇到了I/O并不受阻塞 把I/O交给底层 底层完成后触发事件通知主进程,例如:net.Server对象会在每次有客户端通过TCP发起新连接时触发事件;fs.ReadStream会在文件被打开时触发事件
  • 所有的触发事件的对象都是EventEmitter类的实例 与在客户端不同,客户端大部分是通过用户触发事件如(click,hover之类的)而在服务端大部分需要自己触发事件
以下代码是基础的事件处理效果是每隔500毫秒触发打印的事件
const EventEmitter = require('events');
class CustomEvent extends EventEmitter{

}//CustomEvent继承events的类
const ce = new CustomEvent();
ce.on('test',()=>{// on 用于将一个或多个函数绑定到命名对象上此处绑定箭头函数
    console.log('this is a test')
})
setInterval(()=>{
    ce.emit('test')//eventEmitter.emit() 用于触发事件。当 EventEmitter 对象触发一个事件时,
    //所有绑定在该事件上的函数都会被同步地调用。现在是隔500毫秒触发
},500)
//这个是传递多个参数并捕获异常
const EventEmitter = require('events');
class CustomEvent extends EventEmitter{

}//CustomEvent继承events的类
const ce = new CustomEvent();
ce.on('error',(err,time)=>{//当我们碰到程序错误的时候通知事件处理程序 不管是自己写的程序还是调用别人的程序
    console.log(err,time)
})
ce.emit('error',new Error('oops!'),Date.now())//new Error('oops!')具体传给事件处理程序的一些参数
//只会至多执行一次的监听器
const EventEmitter = require('events');
class CustomEvent extends EventEmitter{

}//CustomEvent继承events的类
const ce = new CustomEvent();
ce.once('test',()=>{//为指定事件注册一个 单次 监听器,所以监听器至多只会触发一次,触发后立即解除该监听器。
    console.log('test event')
})
setInterval(()=>{
    ce.emit('test')
},500)
const EventEmitter = require('events');
class CustomEvent extends EventEmitter{

}//CustomEvent继承events的类
function fn1(){
    console.log('fn1')
}
function fn2(){
    console.log('fn2')
}
const ce = new CustomEvent();
ce.on('test',fn1)
ce.on('test',fn2)
//把两个事件处理函数绑定到test上面
setInterval(()=>{
    ce.emit('test')
},500)
//截止上面会一直输出fn1 fn2
setTimeout(()=>{
    ce.removeListener('test',fn2)
    ce.removeListener('test',fn1)
    //上面是移除单个事件 有两个参数
    ce.removeAllListeners('test')
    //这个是移除test上挂的全部函数 接收一个参数
})

fs(文件系统)
  • 文件I/O是由简单封装的标准POSIX函数提供,通过require(‘fs’)使用该模块,所有的方法都有同步 异步的形式(提倡使用异步)
  • 异步方法的最后一个参数都是一个回调函数。传给回调函数的参数取决于具体方式,但回调函数的第一个参数通常会保留给异常,如果操作成功完成,则第一个参数会是null或undefined
  • 当使用同步方法时,所有异常会被立即抛出,可以使用try/catch来处理异常,或者让异常向上冒泡
const fs = require('fs');
//异步读文件 同步的方法一般不用 有需求请移步官方文档
fs.readFile('./readfile.js','utf8',(err,data)=>{
    if(err) throw err;//语句允许您创建自定义错误。从技术上讲您能够抛出异常(抛出错误)。
    // 异常可以是 JavaScript 字符串、数字、布尔或对象:
    console.log(data.toString())//如果不加toString会得到一个Buffer二进制如果不想写toString也可以
    //在上面第二个参数上面写utf8就行了
})

//写文件 此处四个参数 第一个是写的文件名 第二个是内容,第三个是编码格式,第四个是回调函数
fs.writeFile('./text','This is a text',{encoding:'utf8'},err=>{
    if(err) throw err;
    console.log('done')
})
//可以通过stat判断是否是文件 stat里面包含了文件的信息
fs.stat('stat.js',(err,stats)=>{
  if(err){ //这样写不影响进程
    console.log('文件不存在')
    return 
  }
  console.log(stats.isFile()) true //是否是文件
  console.log(stats.isDirectory())false//是否是文件夹
  cosole.log(stats) //文件信息
})
//重命名
fs.rename()
//删除
fs.unlink()
//读文件夹
fs.readdir('../',files) //files代表所有文件的文件名
//创建文件夹
fs.mkdir
//删除文件夹
fs.rmdir('./文件夹名')
//监听文件的变化
fs.watch('./',{
  recursive:true//是否递归监视次文件夹下面的所有的文件
},(eventType,filename)=>{
  console.log(evenType,filename) //当在次文件夹下操作文件的时候都会在控制台打印出操作的内容
})
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值