1

在 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 是任意整数,sizeinrs._read(size)始终是 16384!这个数字是流的默认值state.highWaterMark,因为在中rs._read()被调用。谁能解释一下?如果不使用参数,它的意义何在?this._read(state.highWaterMark);lib/_stream_readable.jssize

谢谢你。

4

2 回答 2

2

看起来这只是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 }
于 2013-07-17T21:49:12.387 回答
1

我认为打电话是错误的

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

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

rs.pipe(res);
rs.read(size);
于 2013-07-17T21:48:58.267 回答