0

Я в процессе миграции моего проекта NodeJS в Gateway API, и я не могу понять, как загрузить файл из Lambda.API Gateway Response Загрузить файл с помощью Node, PDFMake, Serverless

Вот фрагмент кода ответа в моем локальном проекте Node.

app.get('/downloadPDF', function (req, res) { 
    res.setHeader('Content-disposition', 'attachment; filename=test.pdf'); 
    res.setHeader('Content-type', 'application/pdf'); 
    var PdfPrinter = require('pdfmake'); 
    var printer = new PdfPrinter(fonts); 

    var pdfDoc = printer.createPdfKitDocument(dd); 
    pdfDoc.pipe(res); 
    pdfDoc.end(); 
}); 

Трубопровод к ответу Я смог вернуть PDF.

Вот фрагмент моей лямбда-функции с использованием безсервера.

module.exports.createPDF = (event, context) => { 
    var PdfPrinter = require('pdfmake'); 
    var printer = new PdfPrinter(fonts); 

    var pdfDoc = printer.createPdfKitDocument(dd); 
    pdfDoc.pipe(res); 
    pdfDoc.end(); 
} 

Вот конечная точка в моей serverless.yml

createPDF: 
handler: functions.myFunction 
events: 
    - http: 
     path: services/getPDF 
     method: get 
     response: 
     headers: 
      Content-Type: "'application/pdf'" 
      Content-disposition: "'attachment; filename=test.pdf'" 

Я не знаю, как получить ссылку на объект ответа в Lambda для трубы. Это возможно? Есть ли другой способ?


Update

Я в конечном итоге решить эту проблему, возвращая в формате base64 PDF двоичная в ответ JSON и декодирования на клиенте. Примечание: использование декодирования base64 в шаблоне сопоставления ответов не помогло.

Пример кода:

var buffers = []; 
pdfDoc.on('data', buffers.push.bind(buffers)); 

pdfDoc.on('end', function() { 
    var bufCat = Buffer.concat(buffers); 

    var pdfBase64 = bufCat.toString('base64'); 

return cb(null, 
    {"statusCode": 200, 
    "headers": {"Content-Type": "application/json"}, 
    "body": pdfBase64}); 
}); 

ответ

1

Шлюз API изначально не поддерживает двоичные данные. Некоторые из наших клиентов имели успех base64, кодирующий данные в Lambda, в том числе в ответ JSON и используя шаблон сопоставления ответов для декодирования данных для ответа на клиент.

+0

Спасибо за предложение! К сожалению, у меня не было успеха, идущего по этому маршруту, но он дает мне некоторый опыт работы с шаблонами сопоставления ответов. – Padawan

1

API Gateway не поддерживает отправку бинарных ответов. В качестве альтернативы вы можете получить свои двоичные данные Lambda в S3 и вернуть HTTP перенаправление на местоположение объекта S3 через заголовок Location.

+0

Отличное предложение, и я верю, что это сработает, однако хранение в настоящее время не соответствует требованиям. Надеюсь, это поможет другим! – Padawan

 Смежные вопросы

  • Нет связанных вопросов^_^