Skip to content

Node.jsv16.5.0 版本开始,原生支持 Web Streams API

这使得开发者可以在 Node.js 中使用与浏览器中相同的流处理接口。

Web Streams APINode.js 中提供了一组标准的、跨平台的流接口,可以简化在不同环境下处理流数据的工作。

它包括三种主要的流:

  1. ReadableStream: 用于从数据源读取数据。
  2. WritableStream: 用于将数据写入目标。
  3. TransformStream: 用于在流中转换数据。
js
const {
  ReadableStream,
  WritableStream
} = require('node:stream/web')

const readableStream = new ReadableStream({
  start(controller) {
    // 将数据推送到流中
    controller.enqueue('Hello, world!')
    controller.close()
  }
})

const writableStream = new WritableStream({
  write(chunk) {
    console.log(`写入的数据: ${chunk}`)
  }
})

// 管道传输数据
readableStream.pipeTo(writableStream).then(() => {
  console.log('数据传输完成')
})

1.ReadableStream

js
const { ReadableStream } = require('node:stream/web')

const readableStream = new ReadableStream({
  start(controller) {
    // 将数据块推送到流中
    controller.enqueue('Hello, ')
    controller.enqueue('world!')
    controller.close()
  }
})

const reader = readableStream.getReader()

reader.read().then(({ done, value }) => {
  if (!done) {
    console.log(value) // 输出: Hello, 
  }
  return reader.read()
}).then(({ done, value }) => {
  if (!done) {
    console.log(value) // 输出: world!
  }
})

2.WritableStream

js
const { WritableStream } = require('node:stream/web')

const writableStream = new WritableStream({
  write(chunk) {
    console.log(`写入的数据: ${chunk}`)
  },
  close() {
    console.log('流关闭')
  }
})

const writer = writableStream.getWriter()

writer.write('Hello, ').then(() => {
  return writer.write('world!')
}).then(() => {
  writer.close()
})

3.TransformStream

js
const { TransformStream } = require('node:stream/web')

const transformStream = new TransformStream({
  transform(chunk, controller) {
    controller.enqueue(chunk.toUpperCase())
  }
})

const readableStream = new ReadableStream({
  start(controller) {
    controller.enqueue('hello, ')
    controller.enqueue('world!')
    controller.close()
  }
})

const writableStream = new WritableStream({
  write(chunk) {
    console.log(`转换后的数据: ${chunk}`)
  }
})

// 将可读流通过转换流传输到可写流
readableStream.pipeThrough(transformStream).pipeTo(writableStream)