本篇内容:异步I/O概念、promisify用法、流、buffer,http服务
异步I/O概念
对于这个概念,网上有一个很经典的例子
隔壁王大爷有个水壶,王大爷经常用它来烧开水。
- 王大爷把水壶放到火上烧,然后啥也不干在那等,直到水开了王大爷再去搞别的事情。(同步阻塞)
- 王大爷觉得自己有点憨,不打算等了。把水壶放上去之后大爷就是去看电视,时不时来瞅一眼有没有开(同步非阻塞)
- 王大爷去买了个响水壶,他把响水壶放在火上,然后也是等着水开,水开的时候水壶会发出声响(异步阻塞)
- 王大爷又觉得自己有点憨,他把响水壶放在火上然后去看电视,这时他不用是不是来瞅一眼,因为水开的时候水壶会发出声音通知大爷。(异步非阻塞)
上面四个例子里,阻塞非阻塞说明的是大爷的状态,同步非同步说明的是水壶的调用姿势。水壶能在烧好的时候主动响起,就等同于我们异步的定义,能在结束时通知主线程并且回调。所以异步一般配合非阻塞,才能发挥其作用。
promisify
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| const fs = require('fs')
const data = fs.readFileSync('./xxx.js'); console.log(data);
fs.readFile('./xxxx.js',(err,data)=>{ if(err) throw err console.log(data.toString()) })
const {promisify} = require('util') const readFile = promisify(fs.readFile) readFile('./xxx.js').then(data=>console.log(data))
const fsp = require("fs").promises; fsp.readFile("./confs.js") .then(data => console.log(data)) .catch(err => console.log(err));
(async ()=>{ const fs = require('fs') const {promisify} = require('util') const readFile = promisify(fs.readFile) const data = await readFile('./xxx.js') console.log(data.toString()) })()
|
buffer对象
Buffer - 用于在 TCP 流、文件系统操作、以及其他上下文中与八位字节流进行交互。 八位字节组成的数组,可以有效的在JS中存储二进制数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| const buf1 = Buffer.alloc(10)
console.log(buf1)
const buf2 = Buffer.from('a') console.log(buf2)
const buf3 = Buffer.from('中文') console.log(buf3,buf3.toString())
const buf4 = Buffer.concat([buf2,buf3]) console.log(buf4,buf4.toString())
buf1.write('hello') console.log(buf1,buf1.toString())
|
Buffer类似数组,所以很多数组方法它都有
GBK转码 icon-lite
http服务
创建一个http服务器
1 2 3 4 5 6 7 8
| const http = require('http') const server = http.createServer((request,response) => { console.log('request',request) response.end('hello node') }) server.listen(3000)
|
显示一个首页
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| const http = require('http') const server = http.createServer((request,response) => { const {url, method} = request; if (url === '/' && method === 'GET') { fs.readFile('index.html', (err, data) => { if (err) { response.writeHead(500, { 'Content-Type': 'text/plain;charset=utf-8' }); response.end('500,服务器错误'); return; } response.statusCode = 200; response.setHeader('Content-Type', 'text/html'); response.end(data); }); }else if (url === '/users' && method === 'GET') { response.writeHead(200, { 'Content-Type': 'application/json' }); response.end(JSON.stringify([{name:'tom',age:20}])); } else { response.statusCode = 404; response.setHeader('Content-Type', 'text/plain;charset=utf-8'); response.end('404, 页面没有找到'); } }) server.listen(3000)
|
Stream流
1 2 3 4
| const fs = require('fs') const rs = fs.createReadStream('./1.jpg') const ws = fs.createWriteStream('./2.jpg') rs.pipe(ws)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| const http = require('http') const fs = require('fs') const server = http.createServer((request,response) => { const {url, method, headers} = request; if (url === '/' && method === 'GET') { ... } ... else if (method === 'GET' && headers.accept.includes('image/*')) { fs.createReadStream('.'+url).pipe(response); } ... else{ ... } }) server.listen(3000)
|