I/O处理
关于 I/O ,有一个很经典的响水壶解释。
- 隔壁王大爷有个水壶,王大爷经常用它来烧开水。
- 同步阻塞:王大爷把水壶放到火上烧,然后啥也不干在那等,直到水开了王大爷再去搞别的事情。
- 同步非阻塞:王大爷觉得自己有点憨,不打算等了。把水壶放上去之后大爷就是去看电视,时不时来瞅一眼有没有开。
- 异步阻塞:王大爷去买了个响水壶,他把响水壶放在火上,然后也是等着水开,水开的时候水壶会发出声响。
- 异步非阻塞:王大爷又觉得自己有点憨,他把响水壶放在火上然后去看电视,这时他不用是不是来瞅一眼,因为水开 的时候水壶会发出声音通知大爷。
- 上面四个例子里,阻塞非阻塞说明的是大爷的状态,同步非同步说明的是水壶的调用姿势。水壶能在烧好的时候主动响起,就等同于我们异步的定义,能在结束时通知主线程并且回调。所以异步一般配合非阻塞,才能发挥其作用。
promisify
- 使用
promisify 可以让一个回调函数风格的异步方法变成 promise 风格。 - 利用一个自执行函数,就可以使用
async await 风格书写代码。
(async () => {
const fs = require("fs")
const { promisify } = require("util")
const readFile = promisify(fs.readFile)
const data = await readFile("./test.js")
console.log("data", data.toString())
})()
Buffer
- 读取数据类型为
Buffer 。 - 用于在
TCP 流、文件系统操作、以及其他上下文中与八位字节流进行交互。 八位字节组成的数组,可以有效的在 JS 中存储二进制数据。
const buf1 = Buffer.alloc(10)
console.log('🚀🚀~ buf1:', buf1);
const buf2 = Buffer.from("a")
console.log('🚀🚀~ buf2:', buf2);
const buf3 = Buffer.from('中')
console.log('🚀🚀~ buf3:', buf3);
buf1.write('hello');
console.log(buf1);
console.log(buf3.toString());
const buf4 = Buffer.concat([buf2, buf3])
console.log('🚀🚀~ buf4:', buf4, buf4.toString());
http模块
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" }))
}
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');
})
stream
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)
参考资料
开课吧全栈架构师课程
|