读取ReadableStream并指定大小参数:为什么state.highWaterMark总是被传递到_read()作

Reading a a ReadableStream and specifying a size param: Why does state.highWaterMark always get passed to ._read() as the size?

本文关键字:read highWaterMark ReadableStream state 为什么 参数 读取      更新时间:2023-09-26

在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');                                                                                                                                                                                                           
});   

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

谢谢。

看起来这只是流的highWaterMark,而并非巧合是默认的size。点击此处阅读更多

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 }

我认为调用是错误的

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

这是因为根据文档,rs.read(size)返回一个缓冲区、一个字符串或null。然而,pipe()Readable的一种方法。你可能应该使用

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