读取一个ReadableStream并指定一个大小参数:为什么state.highWaterMark总是作为大小传递给._read()?
在Node.js中,我有一个可读的stream:
var rs = new (require('stream').Readable); rs._read = function(size) { // Implementation. }
这个stream在这个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是任何整数,在rs._read(size)
总是16384! 这个数字是stream的state.highWaterMark
的默认值,因为rs._read()
被调用为this._read(state.highWaterMark);
在lib/_stream_readable.js
。 任何人都可以解释吗? 如果不使用它, size
参数的意义是什么?
谢谢。
看起来这只是stream的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)
返回一个缓冲区,一个string或null
。 但是, pipe()
是Readable
一种方法。 你应该可能正在使用
rs.pipe(res); rs.read(size);