跳至主要內容

stream

微信公众号:储凡2023/2/28大约 3 分钟

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)
})

更新日志

2024/10/28 07:12
查看所有更新日志
  • c0eac-style: update code and docs
  • a3cca-refactor: 替换eslint规则,使用antfu/eslint模块 (#138)
  • c0f2d-refactor: 升级vuepress相关版本,优化项目结构 (#137)
  • b5563-feat: 新增一些文档,调整导航栏内容
  • c374b-feat: 更新一些文档的固定链接 (#87)
  • b0275-feat(markdownlint-cli): 添加markdown文档校验,支持lint脚本自动格式化文档
  • 5f1e1-feat: 导航栏、侧边栏内容修改,新增目录对应的文档
  • 02ab1-style: 文档目录调整,修改mdEnhance配置
  • a23ce-refactor: 新增manuscript目录,优化文稿结构
  • 0ef50-docs: 新增一些文档,修复启动异常