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

Javascript 读取ReadableStream并指定大小参数:为什么state.highWaterMark总是作为大小传递给._read()?,javascript,node.js,Javascript,Node.js,在Node.js中,我有一个可读的流: var rs = new (require('stream').Readable);

在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中的
size
。\u read(size)
始终是16384!此数字是流的
状态的默认值。highWaterMark
,因为
rs.\u read()
被称为
This.\u read(state.highWaterMark)
lib/\u stream\u readable.js
中。有人能解释一下吗?如果不使用,
size
param有什么意义


谢谢。

我想打电话是不对的

rs.read(size).pipe(res);
这是因为根据,
rs.read(size)
返回缓冲区、字符串或
null
。但是,
pipe()
是一种
可读的方法。你可能应该使用

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

看起来这只是流的
highWaterMark
和默认的
size


不知道发生了什么,但16384是0x4000,看起来像是某种错误代码。
rs.read(size.pipe(res)
?对我来说这是有道理的,但我对streams是新手。@dimadima 16384是所有HTTP请求头大小总和的字节限制。我不了解流,但在我看来,您读取的URL查询参数不正确。也许您看到一些缓冲正在进行?如中所示,您请求11个字节,但为了提高性能,某些地方尝试先填充16kB的缓冲区,然后将其中的数据传递给您。因此,
size
rs.read()
中已经有一个错误的值,对吗?那么它不应该与
pipe
方法有关。我还测试了它没有管道,输出是11。不过我用的是浏览器而不是curl。我不知道也许我错过了什么?也许您应该在curl命令?+1中使用引号,当
n
不是一个数字时,它只是在代码中单步执行,并在同一位置结束。事实上,这与正在发生的事情很接近,但并不完全如此
\u read()
通过
状态调用。始终使用高水印。事实上,它从未与任何其他金额一起调用。我需要更多地了解这一点,以了解到底发生了什么,但考虑到
n=howmuchtored(n,state)的发生率略高于此值,但从未使用新的
n
。我需要进一步研究。更新我的问题以反映这些评论。谢谢。是的,一开始我也很想知道。它将在进行修改,但在您的情况下,您永远不会走那么远。谢谢-这也完全是一个问题。
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 }