说说Node.js的流模块Stream之Stream模块概述

 2015年11月16日    89     声明


是一个抽象接口,在Node.js中,是个EventEmitter的一个实例,所以它有'data''end'等事件。stream模块同时又是一个基类,在Node里被不同的对象所实现,如:http.ServerResponse就是一个可写流对象。

  1. stream对象介绍
  2. stream模块的使用
  3. 双工流类: stream.Duplex与转换流类stream.Transform


1. stream对象介绍

stream流的分类

流可以是可读的(Readable)、可写的(Writable) 或双工的(Duplex),在Node中这些流被封装到了stream模块中。你可以通过require('stream')加载Stream基类,这其中就包括了 Readable可读流、Writable可写流、Duplex双工流和 Transform转换流的基类。


stream流对象的使用与扩展

做为一个stream流的使用者,你可以将stream做为一个消费对象。要使用流你要了解其中的事件、方法等,所有的流都是事件发射器EventEmitters,但是也有自己的方法和属性,这取决于他它是可读的(Readable)、可写的(Writable) 或双工的(Duplex),更多详细介绍将在以后单独讨论。

stream模块可以满足我们的大部分的使用需求,Node中的stream流是可扩展的,stream模块提供了重写底层方法的API,在某些情况下你可以按需要编写自己的流对象。


2. stream模块的使用

做为核心和底层模块之一,在很多时候都会使用到stream。以下是在http模块中的使用示例:

var http = require('http');

var server = http.createServer(function (req, res) {
  var body = '';
  // 以 UTF-8 编码获取数据
  // 如果不设置编码,将得到一个 Buffer 对象
  req.setEncoding('utf8');

  // 添加监听器后,可读流会触发 'data' 事件
  req.on('data', function (chunk) {
    body += chunk;
  });

  // 收'end' 事件说明已经得到了完整的 body 数据
  req.on('end', function () {
    try {
      var data = JSON.parse(body);
    } catch (er) {
      // json 格式错误
      res.statusCode = 400;
      return res.end('error: ' + er.message);
    }

    // 通过可写流向用户发送数据
    res.write(typeof data);
    res.end();
  });
});

server.listen(1337);

在上面示例中,req是一个http.IncomingMessage实例,同时它又是一个可读流(Readable stream)。 res是一个http.ServerResponse实例,同时它又是一个可写流(Writable stream)。


3. 双工流类: stream.Duplex与转换流类stream.Transform

双工流类: stream.Duplex

双工流(Duplex streams)是同时实现了 ReadableWritable 接口。

Node中的双工流有:


转换流类stream.Transform

转换流(Transform streams)是一种输出由输入计算所得的双工流。它同时实现了 ReadableWritable 接口。

Node中的转换流有: