关于 I/O
,有一个很经典的响水壶解释。
promisify
可以让一个回调函数风格的异步方法变成 promise
风格。async await
风格书写代码。(async () => {
const fs = require("fs")
// 使用 promisify 可以让一个回调函数形式的异步方法 变成 promise 形式 从而可以使用 async await
const { promisify } = require("util")
// 将 fs.readFile 方法 包装成 promise
const readFile = promisify(fs.readFile)
// 读取的是个 buffer 对象 ,是 js 用来描述二进制的东西
const data = await readFile("./test.js")
// toString方法解析字符串
console.log("data", data.toString())
})()
Buffer
。TCP
流、文件系统操作、以及其他上下文中与八位字节流进行交互。 八位字节组成的数组,可以有效的在 JS
中存储二进制数据。// 创建一个长度为 10 字节以 0 填充的 Buffer
const buf1 = Buffer.alloc(10)
console.log('🚀🚀~ buf1:', buf1);
// 创建一个 Buffer 包含 ascii.
const buf2 = Buffer.from("a")
console.log('🚀🚀~ buf2:', buf2);
// 创建Buffer包含UTF-8字节
// UFT-8:一种变长的编码方案,使用 1~6 个字节来存储;
// UFT-32:一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储;
// UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。
const buf3 = Buffer.from('中')
console.log('🚀🚀~ buf3:', buf3);
// 写入 Buffer 数据
buf1.write('hello');
console.log(buf1);
// 读取 Buffer 数据
console.log(buf3.toString());
// 合并 Buffer 数据
const buf4 = Buffer.concat([buf2, buf3])
console.log('🚀🚀~ buf4:', buf4, buf4.toString());
writeHead
可以同时书写 statusCode
和 setHeader
。req.headers.accept
是否包含 image/*
可以判断是不是请求图片。const http = require("http")
const fs = require("fs")
// 创建服务
const server = http.createServer((req, res) => {
const { url, method, headers } = req
if (url === '/' && method === 'GET') {
fs.readFile("./src/03-http/index.html", (err, data) => {
if (err) {
res.writeHead(500, { 'Content-Type': 'text/plain;charset=utf-8' })
res.end("500 服务器错误")
return
}
res.statusCode = 200
res.setHeader('Content-Type', 'text/html')
res.end(data)
})
}
else if (url === '/getUser' && method === 'GET') {
res.writeHead(200, { 'Content-Type': 'application/json' })
res.end(JSON.stringify({ name: "warbler" }))
}
// Accept代表发送端(客户端)希望接受的数据类型。 比如:Accept:text/xml; 代表客户端希望 接受的数据类型是xml类型。
// Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。 比如:ContentType:text/html; 代表发送端发送的数据格式是html。
// 二者合起来, Accept:text/xml; Content-Type:text/html ,即代表希望接受的数据类型是xml格 式,本次请求发送的数据的数据格式是html。
else if (method === 'GET' && headers.accept.indexOf("image/*") !== -1) {
// 统一描述所有的图片请求
fs.createReadStream(`./src/03-http/${url}`).pipe(res)
}
else {
res.statusCode = 404
res.setHeader('Content-Type', 'text/plain;charset=utf-8')
res.end("404 页面未找到")
}
})
server.listen(3000, () => {
console.log('🚀🚀~ sever at 3002');
})
const fs = require("fs")
// 读流
const rs = fs.createReadStream('./src/04-stream/main.jpg')
// 写流
const ws = fs.createWriteStream('./src/04-stream/main2.jpg')
// 连接导管 可以复制图片到指定目录
rs.pipe(ws)