【node学习】node.js核心模块

2 篇文章 0 订阅

包含了文件模块、路径模块、操作系统模块、事件模块、http模块、Buffer、流、错误处理等多个方面

一、文件系统模块
无需安装。 作为 Node.js 核心的组成部分,可以通过简单地引用来使用它:

const fs = require('fs')

一旦这样做,就可以访问其所有的方法,包括:

1、fs.access():
检查文件是否存在,以及 Node.js 是否有权限访问。
2、fs.appendFile():
追加数据到文件。如果文件不存在,则创建文件。
3、fs.chmod():
更改文件(通过传入的文件名指定)的权限。相关方法:fs.lchmod()、fs.fchmod()。
4、fs.chown():
更改文件(通过传入的文件名指定)的所有者和群组。相关方法:fs.fchown()、fs.lchown()。
5、fs.close():
关闭文件描述符。
6、fs.copyFile():
拷贝文件。
7、fs.createReadStream():
创建可读的文件流。
8、fs.createWriteStream():
创建可写的文件流。
9、fs.link():
新建指向文件的硬链接。
10、fs.mkdir():
新建文件夹。
11、fs.mkdtemp():
创建临时目录。
12、fs.open():
设置文件模式。
13、fs.readdir():
读取目录的内容。
14、fs.readFile():
读取文件的内容。相关方法:fs.read()。
15、fs.readlink():
读取符号链接的值。
16、fs.realpath():
将相对的文件路径指针(.、…)解析为完整的路径。
17、fs.rename():
重命名文件或文件夹。
18、fs.rmdir():
删除文件夹。
19、fs.stat():
返回文件(通过传入的文件名指定)的状态。相关方法:fs.fstat()、fs.lstat()。
20、fs.symlink():
新建文件的符号链接。
21、fs.truncate():
将传递的文件名标识的文件截断为指定的长度。相关方法:fs.ftruncate()。
22、fs.unlink():
删除文件或符号链接。
23、fs.unwatchFile():
停止监视文件上的更改。
24、fs.utimes():
更改文件(通过传入的文件名指定)的时间戳。相关方法:fs.futimes()。
25、fs.watchFile():
开始监视文件上的更改。相关方法:fs.watch()。
26、fs.writeFile():
将数据写入文件。相关方法:fs.write()。
关于 fs 模块的特殊之处是,所有的方法默认情况下都是异步的,但是通过在后面加上 Sync 也可以同步地工作。比如:
fs.rename()
fs.renameSync()

二、路径模块
无需安装。 作为 Node.js 核心的组成部分,可以通过简单地引用来使用它:

const path = require('path')

1、path.basename()
返回路径的最后一部分。 第二个参数可以过滤掉文件的扩展名:

require('path').basename('/test/something') //something
require('path').basename('/test/something.txt') //something.txt
require('path').basename('/test/something.txt', '.txt') //something

2、path.dirname()
返回路径的目录部分:

require('path').dirname('/test/something') // /test
require('path').dirname('/test/something/file.txt') // /test/something

3、path.extname()
返回路径的扩展名部分。

require('path').extname('/test/something') // ''
require('path').extname('/test/something/file.txt') // '.txt'

4、path.isAbsolute()
如果是绝对路径,则返回 true。

require('path').isAbsolute('/test/something') // true
require('path').isAbsolute('./test/something') // false

5、path.join()
连接路径的两个或多个部分:

const name = 'joe'
require('path').join('/', 'users', name, 'notes.txt') //'/users/joe/notes.txt'

6、path.normalize()
当包含类似 .、… 或双斜杠等相对的说明符时,则尝试计算实际的路径:

require('path').normalize('/users/joe/..//test.txt') //'/users/test.txt'

7、path.parse()
解析对象的路径为组成其的片段:

root: 根路径。
dir: 从根路径开始的文件夹路径。
base: 文件名 + 扩展名
name: 文件名
ext: 文件扩展名
例如:

require('path').parse('/users/test.txt')

结果是:

{
  root: '/',
  dir: '/users',
  base: 'test.txt',
  ext: '.txt',
  name: 'test'
}

8、path.relative()
接受 2 个路径作为参数。 基于当前工作目录,返回从第一个路径到第二个路径的相对路径。

require('path').relative('/Users/joe', '/Users/joe/test.txt') //'test.txt'
require('path').relative('/Users/joe', '/Users/joe/something/test.txt') //'something/test.txt'

9、path.resolve()
可以使用 path.resolve() 获得相对路径的绝对路径计算:

path.resolve('joe.txt') //'/Users/joe/joe.txt' 如果从主文件夹运行

通过指定第二个参数,resolve 会使用第一个参数作为第二个参数的基准:

path.resolve('tmp', 'joe.txt') //'/Users/joe/tmp/joe.txt' 如果从主文件夹运行

如果第一个参数以斜杠开头,则表示它是绝对路径:

path.resolve('/etc', 'joe.txt') //'/etc/joe.txt'

三、操作系统模块
该模块提供了许多函数,可用于从底层的操作系统和程序运行所在的计算机上检索信息并与其进行交互。

const os = require('os')

1、os.arch()
返回标识底层架构的字符串,例如 arm、x64、arm64。
2、os.cpus()
返回关于系统上可用的 CPU 的信息。
例如:

[
  {
    model: 'Intel(R) Core(TM)2 Duo CPU     P8600  @ 2.40GHz',
    speed: 2400,
    times: {
      user: 281685380,
      nice: 0,
      sys: 187986530,
      idle: 685833750,
      irq: 0
    }
  },
  {
    model: 'Intel(R) Core(TM)2 Duo CPU     P8600  @ 2.40GHz',
    speed: 2400,
    times: {
      user: 282348700,
      nice: 0,
      sys: 161800480,
      idle: 703509470,
      irq: 0
    }
  }
]

3、os.endianness()
根据是使用大端序或小端序编译 Node.js,返回 BE 或 LE。
4、os.freemem()
返回代表系统中可用内存的字节数。
5、os.homedir()
返回到当前用户的主目录的路径。
例如:

'/Users/joe'

6、os.hostname()
返回主机名。
7、os.loadavg()
返回操作系统对平均负载的计算。
这仅在 Linux 和 macOS 上返回有意义的值。
8、os.networkInterfaces()
返回系统上可用的网络接口的详细信息。
例如:

{ lo0:
   [ { address: '127.0.0.1',
       netmask: '255.0.0.0',
       family: 'IPv4',
       mac: 'fe:82:00:00:00:00',
       internal: true },
     { address: '::1',
       netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
       family: 'IPv6',
       mac: 'fe:82:00:00:00:00',
       scopeid: 0,
       internal: true },
     { address: 'fe80::1',
       netmask: 'ffff:ffff:ffff:ffff::',
       family: 'IPv6',
       mac: 'fe:82:00:00:00:00',
       scopeid: 1,
       internal: true } ],
  en1:
   [ { address: 'fe82::9b:8282:d7e6:496e',
       netmask: 'ffff:ffff:ffff:ffff::',
       family: 'IPv6',
       mac: '06:00:00:02:0e:00',
       scopeid: 5,
       internal: false },
     { address: '192.168.1.38',
       netmask: '255.255.255.0',
       family: 'IPv4',
       mac: '06:00:00:02:0e:00',
       internal: false } ],
  utun0:
   [ { address: 'fe80::2513:72bc:f405:61d0',
       netmask: 'ffff:ffff:ffff:ffff::',
       family: 'IPv6',
       mac: 'fe:80:00:20:00:00',
       scopeid: 8,
       internal: false } ] }

9、os.platform()
返回为 Node.js 编译的平台:
darwin
freebsd
linux
openbsd
win32

10、os.release()
返回标识操作系统版本号的字符串。
11、os.tmpdir()
返回指定的临时文件夹的路径。
12、os.totalmem()
返回表示系统中可用的总内存的字节数。
13、os.type()
标识操作系统:
Linux
macOS 上为Darwin
Windows 上为 Windows_NT
14、os.uptime()
返回自上次重新启动以来计算机持续运行的秒数。
15、os.userInfo()
返回包含当前 username、uid、gid、shell 和 homedir 的对象。

四、事件模块
events 模块为提供了 EventEmitter 类,这是在 Node.js 中处理事件的关键。

const EventEmitter = require('events')
const door = new EventEmitter()

事件监听器返回及使用以下事件:
当监听器被添加时返回 newListener。
当监听器被移除时返回 removeListener。

1、emitter.addListener()
emitter.on() 的别名。
2、emitter.emit()
触发事件。 按照事件被注册的顺序同步地调用每个事件监听器。

door.emit("slam") // 触发 "slam" 事件。

3、emitter.eventNames()
返回字符串(表示在当前 EventEmitter 对象上注册的事件)数组:

door.eventNames()

4、emitter.getMaxListeners()
获取可以添加到 EventEmitter 对象的监听器的最大数量(默认为 10,但可以使用 setMaxListeners() 进行增加或减少)。

door.getMaxListeners()

5、emitter.listenerCount()
获取作为参数传入的事件监听器的计数:

door.listenerCount('open')

6、emitter.listeners()
获取作为参数传入的事件监听器的数组:

door.listeners('open')

7、emitter.off()
emitter.removeListener() 的别名,新增于 Node.js 10。
8、emitter.on()
添加当事件被触发时调用的回调函数。
用法:

door.on('open', () => {
  console.log('打开')
})

9、emitter.once()
添加当事件在注册之后首次被触发时调用的回调函数。 该回调只会被调用一次,不会再被调用。

const EventEmitter = require('events')
const ee = new EventEmitter()
ee.once('my-event', () => {
  //只调用一次回调函数。
})

10、emitter.prependListener()
当使用 on 或 addListener 添加监听器时,监听器会被添加到监听器队列中的最后一个,并且最后一个被调用。 使用 prependListener 则可以在其他监听器之前添加并调用。
11、emitter.prependOnceListener()
当使用 once 添加监听器时,监听器会被添加到监听器队列中的最后一个,并且最后一个被调用。 使用 prependOnceListener 则可以在其他监听器之前添加并调用。
12、emitter.removeAllListeners()
移除 EventEmitter 对象的所有监听特定事件的监听器:
door.removeAllListeners(‘open’)
13、emitter.removeListener()
移除特定的监听器。 可以通过将回调函数保存到变量中(当添加时),以便以后可以引用它:

const doSomething = () => {}
door.on('open', doSomething)
door.removeListener('open', doSomething)

14、emitter.setMaxListeners()
设置可以添加到 EventEmitter 对象的监听器的最大数量(默认为 10,但可以增加或减少)。

door.setMaxListeners(50)

五、http模块
HTTP 核心模块是 Node.js 网络的关键模块
可以使用以下代码引入:

const http = require('http')

1、属性
1.1http.METHODS
此属性列出了所有支持的 HTTP 方法(按字母序排)
1.2http.STATUS_CODES
此属性列出了所有的 HTTP 状态代码及其描述,是“状态码-状态描述”的对象(json?)
1.3http.globalAgent
指向 Agent 对象的全局实例,该实例是 http.Agent 类的实例。
用于管理 HTTP 客户端连接的持久性和复用,它是 Node.js HTTP 网络的关键组件。
会在 http.Agent 类的说明中提供更多描述。

2、方法
2.1http.createServer()
返回 http.Server 类的新实例。
用法:

const server = http.createServer((req, res) => {
  //使用此回调处理每个单独的请求。
})

2.2http.request()
发送 HTTP 请求到服务器,并创建 http.ClientRequest 类的实例
2.3http.get()
类似于 http.request(),但会自动地设置 HTTP 方法为 GET,并自动地调用 req.end()。

3、类
3.1http.Agent
Node.js 会创建 http.Agent 类的全局实例,以管理 HTTP 客户端连接的持久性和复用,这是 Node.js HTTP 网络的关键组成部分。
该对象会确保对服务器的每个请求进行排队并且单个 socket 被复用。
它还维护一个 socket 池。 出于性能原因,这是关键。
3.2http.ClientRequest
当 http.request() 或 http.get() 被调用时,会创建 http.ClientRequest 对象。
当响应被接收时,则会使用响应(http.IncomingMessage 实例作为参数)来调用 response 事件。
返回的响应数据可以通过以下两种方式读取:
可以调用 response.read() 方法。
在 response 事件处理函数中,可以为 data 事件设置事件监听器,以便可以监听流入的数据。
3.3http.Server
当使用 http.createServer() 创建新的服务器时,通常会实例化并返回此类。
拥有服务器对象后,就可以访问其方法:
close() 停止服务器不再接受新的连接。
listen() 启动 HTTP 服务器并监听连接。
3.4http.ServerResponse
由 http.Server 创建,并作为第二个参数传给它触发的 request 事件。
通常在代码中用作 res:

const server = http.createServer((req, res) => {
  //res 是一个 http.ServerResponse 对象。
})

在事件处理函数中总是会调用的方法是 end(),它会关闭响应,当消息完成时则服务器可以将其发送给客户端。 必须在每个响应上调用它。
以下这些方法用于与 HTTP 消息头进行交互:
getHeaderNames() 获取已设置的 HTTP 消息头名称的列表。
getHeaders() 获取已设置的 HTTP 消息头的副本。
setHeader(‘headername’, value) 设置 HTTP 消息头的值。
getHeader(‘headername’) 获取已设置的 HTTP 消息头。
removeHeader(‘headername’) 删除已设置的 HTTP 消息头。
hasHeader(‘headername’) 如果响应已设置该消息头,则返回 true。
headersSent() 如果消息头已被发送给客户端,则返回 true。
在处理消息头之后,可以通过调用 response.writeHead()(该方法接受 statusCode 作为第一个参数,可选的状态消息和消息头对象)将它们发送给客户端。
若要在响应正文中发送数据给客户端,则使用 write()。 它会发送缓冲的数据到 HTTP 响应流。
如果消息头还未被发送,则使用 response.writeHead() 会先发送消息头,其中包含在请求中已被设置的状态码和消息,可以通过设置 statusCode 和 statusMessage 属性的值进行编辑:

response.statusCode = 500
response.statusMessage = '内部服务器错误'

3.5http.IncomingMessage(没看懂)
http.IncomingMessage 对象可通过以下方式创建:
http.Server,当监听 request 事件时。
http.ClientRequest,当监听 response 事件时。
它可以用来访问响应:
使用 statusCode 和 statusMessage 方法来访问状态。
使用 headers 方法或 rawHeaders 来访问消息头。
使用 method 方法来访问 HTTP 方法。
使用 httpVersion 方法来访问 HTTP 版本。
使用 url 方法来访问 URL。
使用 socket 方法来访问底层的 socket。
因为 http.IncomingMessage 实现了可读流接口,因此数据可以使用流访问。

六、Buffer
1、什么是buffer
Buffer 是内存区域。 JavaScript 开发者可能对这个概念并不熟悉,比每天与内存交互的 C、C++ 或 Go 开发者(或使用系统编程语言的任何程序员)要少得多。
它表示在 V8 JavaScript 引擎外部分配的固定大小的内存块(无法调整大小)。
可以将 buffer 视为整数数组,每个整数代表一个数据字节。
它由 Node.js Buffer 类实现。
2、buffer作用
Buffer 被引入用以帮助开发者处理二进制数据,在此生态系统中传统上只处理字符串而不是二进制数据。
Buffer 与流紧密相连。 当流处理器接收数据的速度快于其消化的速度时,则会将数据放入 buffer 中。
一个简单的场景是:当观看 YouTube 视频时,红线超过了观看点:即下载数据的速度比查看数据的速度快,且浏览器会对数据进行缓冲。
3、创建buffer
使用 Buffer.from()Buffer.alloc()Buffer.allocUnsafe() 方法可以创建 buffer。
3.1使用Buffer.from()

const buf = Buffer.from('Hey!')

Buffer.from(array)
Buffer.from(arrayBuffer[, byteOffset[, length]])
Buffer.from(buffer)
Buffer.from(string[, encoding])
3.2使用Buffer.alloc()或者Buffer.allocUnsafe()
也可以只初始化 buffer(传入大小)。 以下会创建一个 1KB 的 buffer:

const buf = Buffer.alloc(1024)
//或
const buf = Buffer.allocUnsafe(1024)

虽然 alloc 和 allocUnsafe 均分配指定大小的 Buffer(以字节为单位),但是 alloc 创建的 Buffer 会被使用零进行初始化,而 allocUnsafe 创建的 Buffer 不会被初始化。 这意味着,尽管 allocUnsafe 比 alloc 要快得多,但是分配的内存片段可能包含可能敏感的旧数据。
4、使用buffer(跟Array差不多)
4.1访问buffer的内容
Buffer(字节数组)可以像数组一样被访问:

const buf = Buffer.from('Hey!')
console.log(buf[0]) //72
console.log(buf[1]) //101
console.log(buf[2]) //121

这些数字是 Unicode 码,用于标识 buffer 位置中的字符(H => 72、e => 101、y => 121)。
可以使用 toString() 方法打印 buffer 的全部内容:
4.2获取buffer长度
使用 length 属性:

const buf = Buffer.from('Hey!')
console.log(buf.length)

4.3迭代buffer的内容

const buf = Buffer.from('Hey!')
for (const item of buf) {
  console.log(item) //72 101 121 33
}

4.4更改buffer的内容
可以使用 write() 方法将整个数据字符串写入 buffer:

const buf = Buffer.alloc(4)
buf.write('Hey!')

就像可以使用数组语法访问 buffer 一样,你也可以使用相同的方式设置 buffer 的内容:

const buf = Buffer.from('Hey!')
buf[1] = 111 //o
console.log(buf.toString()) //Hoy!

4.5复制buffer
使用 copy() 方法可以复制 buffer:

const buf = Buffer.from('Hey!')
let bufcopy = Buffer.alloc(4) //分配 4 个字节。
buf.copy(bufcopy)

4.6切片buffer
如果要创建 buffer 的局部视图,则可以创建切片。 切片不是副本:原始 buffer 仍然是真正的来源。 如果那改变了,则切片也会改变。
使用 slice() 方法创建它。 第一个参数是起始位置,可以指定第二个参数作为结束位置:

const buf = Buffer.from('Hey!')
buf.slice(0).toString() //Hey!
const slice = buf.slice(0, 2)
console.log(slice.toString()) //He
buf[1] = 111 //o
console.log(slice.toString()) //Ho

七、流
1、什么是流
是一种以高效的方式处理读/写文件、网络通信、或任何类型的端到端的信息交换。例如,在传统的方式中,当告诉程序读取文件时,这会将文件从头到尾读入内存,然后进行处理。使用流,则可以逐个片段地读取并处理(而无需全部保存在内存中)。Node.js 的 stream 模块 提供了构建所有流 API 的基础。 所有的流都是 EventEmitter 的实例。
2、流的优势
相对于使用其他的数据处理方法,流基本上提供了两个主要优点:
内存效率: 无需加载大量的数据到内存中即可进行处理。
时间效率: 当获得数据之后即可立即开始处理数据,这样所需的时间更少,而不必等到整个数据有效负载可用才开始。
3、例子
一个典型的例子是从磁盘读取文件。

使用 Node.js 的 fs 模块,可以读取文件,并在与 HTTP 服务器建立新连接时通过 HTTP 提供文件:

const http = require('http')
const fs = require('fs')

const server = http.createServer(function(req, res) {
  fs.readFile(__dirname + '/data.txt', (err, data) => {
    res.end(data)
  })
})
server.listen(3000)

readFile() 读取文件的全部内容,并在完成时调用回调函数。
回调中的 res.end(data) 会返回文件的内容给 HTTP 客户端。
如果文件很大,则该操作会花费较多的时间。 以下是使用流编写的相同内容:

const http = require('http')
const fs = require('fs')
const server = http.createServer((req, res) => {
  const stream = fs.createReadStream(__dirname + '/data.txt')
  stream.pipe(res)
})
server.listen(3000)

当要发送的数据块已获得时就立即开始将其流式传输到 HTTP 客户端,而不是等待直到文件被完全读取。
4、pipe()
上面的示例使用了 stream.pipe(res) 这行代码:在文件流上调用 pipe() 方法。
该代码的作用是什么? 它获取来源流,并将其通过管道传输到目标流。
在来源流上调用它,在该示例中,文件流通过管道传输到 HTTP 响应。
pipe() 方法的返回值是目标流,这是非常方便的事情,它使得可以链接多个 pipe() 调用,如下所示:

src.pipe(dest1).pipe(dest2)

5、api
许多 Node.js 核心模块提供了原生的流处理功能,最值得注意的有:
process.stdin 返回连接到 stdin 的流。
process.stdout 返回连接到 stdout 的流。
process.stderr 返回连接到 stderr 的流。
fs.createReadStream() 创建文件的可读流。
fs.createWriteStream() 创建到文件的可写流。
net.connect() 启动基于流的连接。
http.request() 返回 http.ClientRequest 类的实例,该实例是可写流。
zlib.createGzip() 使用 gzip(压缩算法)将数据压缩到流中。
zlib.createGunzip() 解压缩 gzip 流。
zlib.createDeflate() 使用 deflate(压缩算法)将数据压缩到流中。
zlib.createInflate() 解压缩 deflate 流。

6、流的类型
流分为四类:
Readable: 可以通过管道读取、但不能通过管道写入的流(可以接收数据,但不能向其发送数据)。 当推送数据到可读流中时,会对其进行缓冲,直到使用者开始读取数据为止。
Writable: 可以通过管道写入、但不能通过管道读取的流(可以发送数据,但不能从中接收数据)。
Duplex: 可以通过管道写入和读取的流,基本上相对于是可读流和可写流的组合。
Transform: 类似于双工流、但其输出是其输入的转换的转换流。

7、创建流
7.1可读流
从 stream 模块获取可读流,对其进行初始化并实现 readable._read() 方法。
首先创建可读流对象:

const Stream = require('stream')
const readableStream = new Stream.Readable()

然后实现 _read:

readableStream._read = () => {}

也可以使用 read 选项实现 _read:

const readableStream = new Stream.Readable({
  read() {}
})

现在,流已初始化,可以向其发送数据了:

readableStream.push('hi!')
readableStream.push('ho!')

7.2可写流
若要创建可写流,需要继承基本的 Writable 对象,并实现其 _write() 方法。
首先创建流对象:

const Stream = require('stream')
const writableStream = new Stream.Writable()

然后实现 _write:

writableStream._write = (chunk, encoding, next) => {
  console.log(chunk.toString())
  next()
}

现在,可以通过以下方式传输可读流:

process.stdin.pipe(writableStream)

7.3从可读流中获取数据
7.3.1使用可写流:

const Stream = require('stream')

const readableStream = new Stream.Readable({
  read() {}
})
const writableStream = new Stream.Writable()

writableStream._write = (chunk, encoding, next) => {
  console.log(chunk.toString())
  next()
}

readableStream.pipe(writableStream)

readableStream.push('hi!')
readableStream.push('ho!')

7.3.2使用readable事件直接消费可读流

readableStream.on('readable', () => {
  console.log(readableStream.read())
})

7.4发送数据到可写流
使用write()方法

writableStream.write('hey\n')

7.5使用信号通知已结束写入的可写流
使用end()方法

const Stream = require('stream')

const readableStream = new Stream.Readable({
  read() {}
})
const writableStream = new Stream.Writable()

writableStream._write = (chunk, encoding, next) => {
  console.log(chunk.toString())
  next()
}

readableStream.pipe(writableStream)

readableStream.push('hi!')
readableStream.push('ho!')

writableStream.end()

文件模块

const fs = require("fs")

fs.access(
  "/Users/zhouziyue1/Desktop/code/plugins_and_loaders/loaders/drop_console.js",
  0,
  (err) => {
    // path mode callback
    console.log("access", err)
  }
)

fs.appendFile(
  "/Users/zhouziyue1/Desktop/code/plugins_and_loaders/loaders/create_file.js",
  "123123",
  (err) => {
    //path data callback
    console.log("appendFile", err)
  }
)

// fs.chmod() path mode callback
// fs.close() fd callback
// fs.chown() path uid gid callback
fs.copyFile(
  "/Users/zhouziyue1/Desktop/code/plugins_and_loaders/loaders/create_file.js",
  "/Users/zhouziyue1/Desktop/code/plugins_and_loaders/loaders/create_file1.js",
  (err) => {
    //src dest callback
    console.log("copyFile", err)
  }
)
// fs.createReadStream() path options
// fs.createWriteStream() path options
fs.link(
  "/Users/zhouziyue1/Desktop/code/plugins_and_loaders/loaders/create_file.js",
  "/Users/zhouziyue1/Desktop/code/plugins_and_loaders/loaders/create_file2.js",
  (err) => {
    //existPath newPath callback
    console.log("link", err)
  }
)
fs.mkdir(
  "/Users/zhouziyue1/Desktop/code/plugins_and_loaders/loaders/newdir",
  //指定位置新建了一个名为newdir的文件夹
  (err) => {
    console.log("mkdir", err)
  }
)
fs.mkdtemp("123", (err, folder) => {
  //直接创建了一个以123为前缀加上乱码的文件夹
  console.log("mkdtemp", folder) //返回文件临时文件夹名称,是本文件夹的子文件夹
})
// fs.open() path flags mode callback
fs.readdir("/Users", (err, fileNames) => {
  console.log("readdir", fileNames)
})
fs.readFile(
  "/Users/zhouziyue1/Desktop/code/plugins_and_loaders/loaders/create_file2.js",
  (err, data) => {
    console.log("readFile", data)
  }
)
fs.readlink("../creater_file.js", (err, linkstring) => {
  console.log("readlink error", err)
  console.log("readlink", linkstring)
})
fs.realpath("../creater_file.js", (err, resolvedPath) => {
  console.log("realpath error", err)
  console.log("realpath", resolvedPath)
})
fs.rename(
  "/Users/zhouziyue1/Desktop/code/plugins_and_loaders/loaders/create_file2.js",
  "/Users/zhouziyue1/Desktop/code/plugins_and_loaders/loaders/ababa.js",
  (err) => {
    console.log("rename", err)
  }
)
fs.rmdir('/Users/zhouziyue1/Desktop/code/plugins_and_loaders/123h1uMWb',err=>{
    console.log("rmdir",err)
})
fs.stat("/Users/zhouziyue1/Desktop/code/plugins_and_loaders/loaders/ababa.js",(err,stats)=>{
    console.log('stat error',err)
    console.log('stat',stats)
})
// fs.unlink()
// fs.symlink()
// fs.unwatchFile()
fs.writeFile('/Users/zhouziyue1/Desktop/code/plugins_and_loaders/loaders/ababa.js','9876543',err=>{
    console.log('writeFile',err)
})a
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值