API网关响应使用Node,PDFMake,无服务器下载文件

时间:2016-09-21 22:55:03

标签: node.js aws-lambda aws-api-gateway pdfmake serverless-framework

我正在将我的NodeJS项目迁移到API网关,我无法弄清楚如何从Lambda下载文件。

以下是我本地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。

以下是使用无服务器的lambda函数的片段。

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中的响应对象来管道。那可能吗?还有另一种方式吗?

更新

我最终通过在JSON响应中返回base64编码的PDF二进制文件并在客户端上解码来解决此问题。 注意:在响应映射模板中使用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});
});

2 个答案:

答案 0 :(得分:1)

API Gateway本身不支持二进制数据。我们的一些客户已成功使用Lamb64编码数据,包括JSON响应和使用响应映射模板解码数据以响应客户端。

答案 1 :(得分:1)

API Gateway不支持发送二进制响应。作为替代方案,您可以将Lambda存储二进制数据放在S3中,并通过HTTP标题返回S3重定向到Location对象位置。