首页 > 解决方案 > 使用 Node.js 以 JSON 格式发送 PDF 文件时使用什么数组格式

问题描述

我们正在使用 Express.js 开发 Node.js API。我们的一个函数接收一些 ID。我们获取该 ID 并在 json 响应中返回一个 pdf 文件(存储在 AWS 上),如下所示:

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

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

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

标签: node.jsarraysjsonexpressuint8array

解决方案


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

虽然您不关心大小,但我会注意到编码为 JSON 的数组将使用大约 2.7 倍于 base64 编码的数据量。将其乘以数千个请求,您就会有更多的数据通过网络传输。

任何现代客户端都应该能够解码任何这些格式。我认为 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);
200kb 的 JSON 数据大小(以字节为单位):

┌──────────┬────────┐
│(索引)│价值观│
├──────────┼────────┤
│ 阵列 │ 731143 │
│ 十六进制 │ 409610 │
│ Base64 │ 273078 │
└──────────┴────────┘


推荐阅读