pdf 不是从 Aws Lambda 返回的,但在本地工作正常



我正在nodejs中创建一个无服务器应用程序,并使用命令"sls deploy"到Aws Cloud。应用程序功能是在通过获取终结点访问时发回 pdf。我正在使用pdfkit创建pdf内容并根据GET请求返回它。这在本地工作正常。但是,当我将代码部署到 aws 时,我看到我的函数执行很好(云形成日志是这样说的(,但是我的 pdf 返回为空。以下是我正在使用的 pdfkit 包

http://pdfkit.org/docs/getting_started.html

请让我知道,我该如何解决这个问题..

const serverless = require('serverless-http');
const express = require('express');
const bodyParser = require('body-parser');
const axios = require('axios');
const app = express();
const PDFDocument = require('pdfkit');
const fs = require('fs');
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
app.get('/retrievePdf', (req, res) => {
var doc = new PDFDocument({size: "A4"});
doc.pipe(res);
doc.fontSize(16).text("Sample Pdf").moveDown();
doc.end();
});
app.listen(3000, function () {
console.log('listening on port 3000')
});
module.exports.handler = serverless(app);

Lambda 函数中的 PDF 生成可能非常挑剔,因为它通常需要并假设它运行的运行时(字体、操作系统版本等(中的许多内容。

经过一些试验和错误,最终我在 Lambda 中生成 PDF 的方法是使用 wkhtmltopdf 并上传它的二进制文件以及我的函数代码,尽管我的用例非常喜欢渲染文档的 HTML 格式。

请注意,为了通过 API 网关返回二进制文档,您必须将某些内容类型显式映射为二进制,否则最终将得到 base64 编码的字符串响应。执行此操作的一种简单方法是使用无服务器插件(如无服务器-apigw-binary(,并确保在 Lambda 代码中正确设置响应内容类型。