我有一个Nodejs API,在响应中返回PDF文件。它以二进制数据的形式返回PDF。在我的前端,我使用一个名为React-PDF的包,它接受PDF端点url并获取要显示的数据。在我决定切换到无服务器框架(包括无服务器脱机)之前,这一切都很好。
现在切换到无服务器后,当我的前端获取PDF时,它无法加载并向控制台Warning: Indexing all PDF objects
记录警告。我使用工具vbindiff比较从正常Nodejs Express API下载的相同PDF文件与使用无服务器框架从API下载的PDF文件,我看到两个文件的长度相同,但从无服务器API下载的文件在某些地方有不同的内容。
我发现了一些关于无服务器和二进制数据问题的类似问题,我将他们推荐的配置添加到无服务器中。Yml文件,应该允许二进制数据,但这对结果没有改变。
下面是建议添加的配置,以允许二进制数据通过API网关
provider:
apiGateway:
binaryMediaTypes:
- "*/*"
这是我的完整无服务器。yml文件
service: flightchecklists-backend
frameworkVersion: "3"
provider:
name: aws
runtime: nodejs12.x
memorySize: 1024
timeout: 30
region: ${opt:region}
# To allow binary pdf responses.
apiGateway:
binaryMediaTypes:
- "*/*"
functions:
handler:
handler: server.handler
events:
- http:
path: /
method: ANY
cors: true
- http:
path: /{proxy+}
method: ANY
cors: true
plugins:
- serverless-offline
custom:
serverless-offline:
noPrependStageInUrl: true
httpPort: 3000
这是我的server.js文件
"use strict";
require("dotenv").config();
require("log-aws-lambda")();
const express = require("express");
const serverless = require("serverless-http");
const bodyParser = require("body-parser");
const path = require("path");
const cors = require("cors");
const app = express();
const checklists = require("./routes/checklists");
const checkout = require("./routes/checkout");
const customerPortal = require("./routes/customerPortal");
const paymentUsers = require("./routes/paymentUsers");
const webhook = require("./routes/webhook");
const subscriptions = require("./routes/subscriptions");
const orders = require("./routes/orders");
const isAdmin = require("./routes/isAdmin");
const blockExternalRequests = require("./middleware/blockExternalRequests");
const namedLogger = require("./utils/logger");
const logger = new namedLogger("server.js");
const port = 3000;
// Cors
app.use(cors());
// Webhook route (Needs to be before bodyparser)
app.use("/webhook", webhook);
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// View engine
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "pug");
app.use(
"/static",
blockExternalRequests,
express.static(path.join(__dirname, "public"))
);
// Routes
app.use("/checklists", checklists);
app.use("/create-checkout-session", checkout);
app.use("/create-portal-session", customerPortal);
app.use("/paymentusers", paymentUsers);
app.use("/subscriptions", subscriptions);
app.use("/orders", orders);
app.use("/isadmin", isAdmin);
// Comment when using serverless.
app.listen(port, () => {
logger.info(`Server started on port ${port}...`);
});
// Export for tests
// module.exports = app;
// Uncomment for serverless.
// module.exports.handler = serverless(app);
我不知道在这一点上该怎么办。很明显,我的API在没有无服务器的情况下工作得很好,但我想使用无服务器框架。我想知道这是否与我正在使用的无服务器脱机包有关,但我找不到有关该包的二进制数据的任何文档。我将感激任何我能得到的帮助。如果还有其他我没有提供的信息,请告诉我,我可以发布。谢谢你。
编辑:根据要求,我上传了两个pdf,第一个是通过Nodejs API正确下载的,第二个是通过无服务器框架下载的,导致文件损坏。
pdf文件可从下列网页下载。希望这是允许的。
https://ufile.io/f/t3ga1
遗憾的是,我还没有想出一个解决方案,只是我复制了同样的事情,你使用无服务器二进制数据损坏(离线以及从lambda)。使用正确返回二进制数据块的节点直接运行应用程序,如果我使用无服务器发送它,则块已损坏。和你一样,我在serverless.yml:
中的提供商块中也有类似的块apiGateway:
binaryMediaTypes:
- 'application/octet-stream'