stream
About 3 min
node核心模块 stream
什么是stream流
流(Stream),是一个数据传输手段,是端到端信息交换的一种方式,而且是有顺序、逐块读取数据、处理内容。常见使用场景http传输大文件,本地文件读取。
node中流的基本类型
- Readable - 可读操作。
- Writable - 可写操作。
- Duplex - 可读可写操作.
- Transform - 操作被写入数据,然后读出结果。
常用事件:
- data - 当有数据可读时触发。
- end - 没有更多的数据可读时触发。
- error - 在接收和写入过程中发生错误时触发。
- finish - 所有数据已被写入到底层系统时触发。
使用express框架简单搭一个 http传输流
首先需要创建两个文件 input.txt 、output.txt
功能:读取input.txt中文件流式发送到服务端,服务端解析到output.txt
依赖
"dependencies": {
"@types/axios": "^0.14.0",
"axios": "^1.2.2",
"express": "^4.18.2",
},
"devDependencies": {
"@types/express": "^4.17.15",
"@types/node": "^18.11.18",
}
服务端
import fs, { read } from 'node:fs'
import express from 'express'
const app = express()
app.post('/', (req, res) => { // node中req res本身也是流
const writerStream = fs.createWriteStream('./output.txt')
req.pipe(writerStream) // 管道传输
req.on('end', () => {
res.write('结束')
res.end()
})
})
app.listen(8081)
客户端发送请求
import fs from 'node:fs'
import axios from 'axios'
const file = fs.createReadStream('./input.txt')
const url = 'http://localhost:8081/'
axios({
method: 'post',
data: file,
url,
headers: {
'Content-Type': 'application/octet-stream',
},
}).then((res) => {
console.log(res.data)
})