使用 Node.js 在 JSON 中发送 PDF 文件时使用什么数组格式

What array format to use when sending PDF file in JSON using Node.js

我们正在使用 Express.js 开发 Node.js API。我们的功能之一接收到一些 ID。我们在 json 响应中使用该 ID 和 return 一个 pdf 文件(存储在 AWS 上),看起来像这样:

{
    ID: "id10", 
    pdf: [21, 23, 34, 46, ...]
}

我们面临的问题是我们不确定应该将该 pdf 转换成什么格式。我们应该将其转换为 Base64 字符串、Uint8 数组、二进制数组还是其他内容?

pdf 文件大小永远不会超过 200kb,因此响应大小和响应时间应该不是问题。

这些格式中的任何一种都可以工作,我见过同时使用数组和 base64 编码的 API。您也可以使用十六进制编码,base58 任何其他编码。

虽然您不关心大小,但我会注意到编码为 JSON 的数组将使用大约 base64 编码数据量的 2.7 倍。将此乘以数千个请求,您将获得更多的数据。

任何现代客户端都应该能够解码这些格式中的任何一种。我不认为 base64 编码会比使用数组难得多,但它会更有效地利用资源。

你可以很容易地证明这一点:

function getRandomBuffer(length) {
    return Buffer.from(Array.from( { length }, (v,k) => Math.floor(Math.random()*256)))
}

function getJSONLength(obj) {
    return JSON.stringify(obj).length;
}

const buf = getRandomBuffer(200 * 1024);

const jsonLengths = { 
    Array: getJSONLength({ pdf: [...buf] }),
    Hex: getJSONLength({ pdf: buf.toString("hex")}),
    Base64: getJSONLength({ pdf: buf.toString("base64") })
}

console.table(jsonLengths);
JSON data size in bytes for 200kb: 

┌─────────┬────────┐
│ (index) │ Values │
├─────────┼────────┤
│  Array  │ 731143 │
│   Hex   │ 409610 │
│ Base64  │ 273078 │
└─────────┴────────┘