读取一个ReadableStream并指定一个大小参数:为什么state.highWaterMark总是以大小传递给._read()?

时间:2013-07-17 21:36:17

标签: javascript node.js

在Node.js中,我有一个可读流:

var rs = new (require('stream').Readable);                                                                                                                                                                                                    
rs._read = function(size) {                                                                                                                                                                                                                   
  // Implementation. 
}   

此流在此HTTP服务器实例中被读取:

var http = require('http');

var server = http.createServer(function(req, res) {                                                                                                                                                                                           
  var size = require('url').parse(req.url, true).query.size;                                                                                                                                                                                  
  if (size) {    
    rs.pipe(res);                                                                                                                                                                                                                        
    rs.read(parseInt(size));
  }                                                                                                                                                                                                                                           
  res.end('');                                                                                                                                                                                                                                
});                                                                                                                                                                                                                                           

server.listen(3001, function() {                                                                                                                                                                                                              
  console.log('Listening on 3001');                                                                                                                                                                                                           
});   

现在,当我curl localhost:3001/?size=n,其中n是任意整数时,size中的rs._read(size)始终为16384!此数字是流state.highWaterMark的默认值,因为rs._read()this._read(state.highWaterMark);中被称为lib/_stream_readable.js。有谁能解释一下? size param如果不使用它有什么意义?

谢谢。

2 个答案:

答案 0 :(得分:2)

看起来这只是流的highWaterMarknot coincidentally默认的sizeRead more here

var stream = require("stream");

var rs = new stream.Readable();

{ _readableState:
   { highWaterMark: 16384,
     buffer: [],
     length: 0,
     pipes: null,
     pipesCount: 0,
     flowing: false,
     ended: false,
     endEmitted: false,
     reading: false,
     calledRead: false,
     sync: true,
     needReadable: false,
     emittedReadable: false,
     readableListening: false,
     objectMode: false,
     defaultEncoding: 'utf8',
     ranOut: false,
     awaitDrain: 0,
     readingMore: false,
     decoder: null,
     encoding: null },
  readable: true,
  domain: null,
  _events: {},
  _maxListeners: 10 }

答案 1 :(得分:1)

我认为拨打

是错误的
rs.read(size).pipe(res);

这是因为根据the docsrs.read(size)返回缓冲区,字符串或null。但是,pipe()Readable的方法。你可能应该使用

rs.pipe(res);
rs.read(size);