如何从请求修改流在HummusJS一个新的响应流(How to modify a stream fr

2019-11-05 02:37发布

我需要注入PNG到使用HummusJS的PDF文件。

在我的API的量产版本,我会收到包含我会转换成二进制读取流64基POST请求。 (在下面的例子中,我使用从本地文件中读取的测试)。

这里是我的测试输入流(这是在“创造”对象工厂定义的):

hummusReadStreamObject (filePath) {
  let fileData = fs.readFileSync(filePath).toString('hex');
  let result = []
  for (var i = 0; i < fileData.length; i+=2) {
    result.push('0x'+fileData[i]+''+fileData[i+1])
  }
  return new hummus.PDFRStreamForBuffer(result)
},

我生成一个PNG(我已经证实,巴新是书面和有效的),然后流的“最后”事件过程中执行修改

png.on('finish', function () {
    create.modifiedPDFResponseStream({
      pngFileName,
      readStream: create.hummusReadStreamObject('/foo/file/path'),
      res
    })
  })

modifiedPDFResponseStream现在拉在PNG和应该将其追加到文件中:

modifiedPDFResponseStream ({ pngFileName, readStream, res }) {
  const writeStream = new hummus.PDFStreamForResponse(res)
  const pdfWriter = hummus.createWriterToModify(
    readStream,
    writeStream,
    { log: `path/to/error.txt` })
  debugger
  const pageModifier = new hummus.PDFPageModifier(pdfWriter,0);
  if (pngFileName) {
    const ctx = pageModifier.startContext().getContext()
    ctx.drawImage(2, 2, `./path/to/${pngFileName}`)
    pageModifier.endContext().writePage()
    pdfWriter.end()
  }
}

我感到,我靠近的解决方案,错误日志没有报告任何问题,但我收到透过Chrome进行调试时,以下情况除外:

events.js:183 Uncaught Error: write after end
at write_ (_http_outgoing.js:622:15)
at ServerResponse.write (_http_outgoing.js:617:10)
at PDFStreamForResponse.write

是问题事做的事实,流在巴纽的过程中被填充.on('finish', ...)事件? 如果是这样,有我可以采取将缓解这一问题同步的方法吗?

Answer 1:

从@JAM在解决方案的启发“ 等待所有流完成-流文件的目录 ”

我通过具有解决这个问题.pngWriteStream方法返回一个承诺,其上完成的writestream决心:

return new Promise((resolve, reject) => {
      try {
        writeStream.on('finish', resolve)
      } catch (e) {
        $.logger.error(e.message)
        reject()
      }

所以不是

const png = create.pngWriteStream({ ... })
png.on('finish', function () {
  create.modifiedPDFResponseStream({
    pngFileName,
    readStream: create.hummusReadStreamObject('/foo/file/path'),
    res
  })
})

我等待承诺的分辨率

const png = await create.pngWriteStream({
    fileName: pngFileName,
    value: '123456789' })

和IMG文件是可hummus.js写入PDF!

create.modifiedPDFResponseStream({
    pngFileName,
    readStream: create.hummusReadStreamObject('/foo/file/path'),
    writeStream: new hummus.PDFStreamForResponse(res)
  })


文章来源: How to modify a stream from request to a new response stream in HummusJS