如何在HummusJS中将流从请求修改为新的响应流

时间:2018-08-07 16:09:20

标签: node.js stream hummus.js

我需要使用HummusJS将png注入到PDF中。

在我的API的生产版本中,我将收到一个包含base64的发布请求,该请求将转换为二进制阅读器流。 (在下面的示例中,我正在使用从本地文件读取的测试。)

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

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已写入且有效),然后在流的“最终”事件期间执行修改

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

问题是否与在.png的.on('finish', ...)事件期间填充流有关?如果是这样,我是否可以采用一种同步方法来缓解此问题?

1 个答案:

答案 0 :(得分:0)

受到@JAM在“ wait for all streams to finish - stream a directory of files”中的解决方案的启发

我解决了这个问题,方法是让.pngWriteStream方法返回一个Promise,并让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)
  })