Сохраните необработанный ответ/двоичные данные для ответа в формате PDF

#javascript #node.js #pdf #amazon-s3

Вопрос:

Я получаю ответ в узле, чтобы получить PDF-файл, в котором я хотел бы сохранить двоичные данные и загрузить их в S3, который затем я могу извлечь, как мне заблагорассудится, для исторических целей. Прямо сейчас у меня возникли проблемы с извлечением этих необработанных данных PDF/двоичных данных, чтобы я мог сохранить их в формате PDF и загрузить, я думаю, что приближаюсь. это и есть ответ.тело, которое я получаю.

 PassThrough {
  _readableState: ReadableState {
    objectMode: false,
    highWaterMark: 16384,
    buffer: BufferList { head: null, tail: null, length: 0 },
    length: 0,
    pipes: null,
    pipesCount: 0,
    flowing: null,
    ended: false,
    endEmitted: false,
    reading: false,
    sync: false,
    needReadable: false,
    emittedReadable: false,
    readableListening: false,
    resumeScheduled: false,
    emitClose: true,
    autoDestroy: false,
    destroyed: false,
    defaultEncoding: 'utf8',
    awaitDrainWriters: null,
    multiAwaitDrain: false,
    readingMore: false,
    decoder: null,
    encoding: null,
    [Symbol(kPaused)]: null
  },
  readable: true,
  _events: [Object: null prototype] {
    prefinish: [Function: prefinish],
    unpipe: [Function: onunpipe],
    error: [ [Function: onerror], [Function] ],
    close: [Function: bound onceWrapper] { listener: [Function: onclose] },
    finish: [Function: bound onceWrapper] { listener: [Function: onfinish] }
  },
  _eventsCount: 5,
  _maxListeners: undefined,
  _writableState: WritableState {
    objectMode: false,
    highWaterMark: 16384,
    finalCalled: false,
    needDrain: false,
    ending: false,
    ended: false,
    finished: false,
    destroyed: false,
    decodeStrings: true,
    defaultEncoding: 'utf8',
    length: 0,
    writing: false,
    corked: 0,
    sync: true,
    bufferProcessing: false,
    onwrite: [Function: bound onwrite],
    writecb: null,
    writelen: 0,
    afterWriteTickInfo: null,
    bufferedRequest: null,
    lastBufferedRequest: null,
    pendingcb: 0,
    prefinished: false,
    errorEmitted: false,
    emitClose: true,
    autoDestroy: false,
    bufferedRequestCount: 0,
    corkedRequestsFree: {
      next: null,
      entry: null,
      finish: [Function: bound onCorkedFinish]
    }
  },
  writable: true,
  allowHalfOpen: true,
  _transformState: {
    afterTransform: [Function: bound afterTransform],
    needTransform: false,
    transforming: false,
    writecb: null,
    writechunk: null,
    writeencoding: null
  },
  [Symbol(kCapture)]: false
} 
 

Это мой код:

 platform.on(platform.events.loginSuccess, async function(e) {
    let resp = await platform.get('/restapi/v1.0/account/~/extension/' accountId '/message-store', {
        messageType: ['Fax'],
        dateFrom: ['2021-05-01'],
        dateTo: ['2021-05-16']


    })
    let jsonObj = await resp.json()
    let attachId = jsonObj.records[0].id

    let getMessageContent = await platform.get('/restapi/v1.0/account/~/extension/' accountId '/message-store/' attachId '/content/' attachId, {
        contentDisposition: ['Inline']
    })
 

Я знаю, что ответ, который я получаю, правильный, потому что, если я запущу этот URL в postman и использую опцию предварительного просмотра, я смогу увидеть pdf (см. Скриншот). Что я упускаю?

введите описание изображения здесь

Ответ №1:

По-моему, это выглядит примерно правильно. Ответ.тело — это читаемый node.js поток, содержащий двоичные данные, и я предполагаю, что Почтальон автоматически считывает этот поток и отображает результат.

Хорошей новостью является то, что этот тип потока является именно тем, что S3 хочет использовать в качестве тела запроса при загрузке файлов, а это означает, что вам не нужно никуда его сохранять — вы можете просто передать его непосредственно в S3. В зависимости от вашей реализации ваш код может выглядеть примерно так:

     const result = await s3Client.upload({
        Bucket: 'MY_S3_BUCKET',
        Key: 'myfilename.pdf',
        Body: response.body,
    }).promise(); 

Где ответ.тело — это поток, который вы зарегистрировали выше. Это должно поместить pdf-файл прямо в S3, готовый для загрузки.

Но если вы настаиваете на сохранении файла, вы также можете передать поток в метод fs.writeFileSync следующим образом:

 fs.writeFileSync('my-pdf.pdf', response.body);