【问题标题】:How to modify a stream from request to a new response stream in HummusJS如何在 HummusJS 中将请求流修改为新的响应流
【发布时间】:2019-01-14 19:18:02
【问题描述】:

我需要使用 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 已写入且有效),然后在流的“finally”事件期间执行修改

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', ...) 事件期间填充流这一事实有关?如果是这样,我可以采取一种同步方法来缓解这个问题吗?

【问题讨论】:

    标签: node.js stream hummus.js


    【解决方案1】:

    灵感来自 @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)
      })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2015-12-08
      • 2016-07-26
      相关资源
      最近更新 更多