【问题标题】:Pdf not returning from Aws Lambda, but working fine in localPdf 未从 Aws Lambda 返回,但在本地工作正常
【发布时间】:2019-07-26 23:49:09
【问题描述】:

我正在 nodejs 中创建一个无服务器应用程序,并使用命令“sls deploy”到 Aws Cloud。 app 功能是在通过 get 端点访问时发回 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 是在 VPC 还是任何子网下?
  • 我正在使用无服务器模式来部署这个节点 js 应用程序.. 我相信该模式只是创建了一个用于执行的 apigateway 和 lambda 函数......
  • 您的 lambda 执行日志中有什么内容? API 方法的执行日志中有什么内容?
  • 我在 doc.end() 之后打印了一个控制台语句,我看到它正在打印.. 我在 lambda 函数中没有看到任何错误。

标签: node.js amazon-web-services serverless-framework aws-serverless node-pdfkit


【解决方案1】:

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

经过反复试验,最终我在 Lambda 中生成 PDF 的方法是使用 wkhtmltopdf 并将二进制文件连同我的函数代码一起上传,尽管我的用例非常喜欢渲染文档的 HTML 格式方式。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2019-04-20
    • 2017-06-05
    • 2023-03-12
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多