我需要获取一个20Mb json对象数组的序列,管道传输到一个流中,分成33个项目的较小数组,将其转换为html,然后管道传输到另一个流(用于pdf转换)。
问题是,我还不太了解节点流是如何工作的。我正试图使用Duplex流来解决这个问题,但我不知道如何将来自上层流的传入块集中起来,并将它们分部分发送到下层流。在这个代码
jsonReader = fs.createReadStream 'source.json'
class Convert extends Duplex
constructor: ->
super readableObjectMode: true
# Duplex.call @, readableObjectMode: true
@buffer = []
_read: (lines) ->
console.log "buffer #{@buffer.length}"
if @buffer.length is 0
@push null
else
console.log "lines: #{lines}"
page = @buffer.slice 0, 33
console.log page.length
@buffer.splice 0, 33
@push page
_write: (data, enconding, next) ->
@buffer.push data
next()
convert = new Convert()
jsonReader.pipe(convert).pipe(process.stdout)
@缓冲区总是空的。node将从上层流传入的块存储在哪里?
您在_write
中接收的data
是一个缓冲区,是输入文件的二进制部分,您不会接收对象甚至字符串。你可以手动解析块来检索你的对象,或者你可以在内存中加载整个文件(20Mb不是那么大)并解析它
es = require('event-stream')
convert = (path) ->
# load and parse your file
content = JSON.parse fs.readFileSync(path, 'utf8')
es.readable (count, next) ->
# emit 33 elements at a time until content.length === 0
while content.length
this.emit 'data', content.splice(0, 33)
# close the stream
this.emit 'end'
next()
srcPath = __dirname + '/source.json'
# convert is a stream
convert(srcPath)
# piping to console.log because process.stdout can't handle objects
.pipe(es.map (arr, next) ->
console.log arr
next()
)