如何在Back4app Parse Server中通过云函数生成并处理PDF文件
Back4app Parse Server 云函数生成PDF实现方案
核心实现逻辑
不需要提前获取Back4app的持久化存储路径,可先将PDF生成到云函数运行环境的临时目录或直接生成二进制缓冲,再把二进制内容传给Parse.File构造函数,走平台标准的文件上传流程即可。
具体实现步骤
- 第一步:在云函数的
package.json中引入你需要的PDF生成依赖,常见可选pdfkit、puppeteer等库。 - 第二步:生成PDF时根据库的特性二选一输出方式:
- 输出到临时文件:所有需要指定输出路径的库,直接把输出路径设为
/tmp目录下的任意文件名即可,Back4app云函数的Node.js环境对/tmp目录有读写权限,生成的文件会在云函数执行结束后自动清理,不会占用额外资源。 - 输出到内存缓冲:部分PDF库支持直接返回二进制Buffer,不需要写入磁盘,该方式性能更好,优先选择。
- 输出到临时文件:所有需要指定输出路径的库,直接把输出路径设为
- 第三步:读取生成的PDF内容构造
Parse.File对象,若PDF存储在临时文件则用fs模块读取文件Buffer,若直接生成Buffer可直接使用。Parse.File构造函数仅需传入文件名、文件内容Buffer、MIME类型三个参数,不需要提前指定持久化存储路径。 - 第四步:调用
Parse.File的save()方法,Back4app会自动将文件上传到平台存储集群,返回带访问地址的文件对象。 - 第五步:将返回的文件对象关联到你需要绑定的
Parse.Object对应字段上,再保存该对象即可完成全流程。
参考代码示例(基于pdfkit)
const PdfKit = require('pdfkit'); const fs = require('fs'); const path = require('path'); Parse.Cloud.define('generatePdf', async (request) => { // 定义临时文件存储路径 const tempPdfPath = path.join('/tmp', `output_${Date.now()}.pdf`); // 初始化PDF实例,写入到临时路径 const doc = new PdfKit(); const writeStream = fs.createWriteStream(tempPdfPath); doc.pipe(writeStream); // 自定义写入PDF内容 doc.text('自定义PDF内容', 100, 100); doc.end(); // 等待PDF写入完成 await new Promise((resolve, reject) => { writeStream.on('finish', resolve); writeStream.on('error', reject); }); // 读取临时文件的二进制内容 const pdfBuffer = fs.readFileSync(tempPdfPath); // 构造Parse.File并上传到Back4app存储 const pdfFile = new Parse.File('generated.pdf', [pdfBuffer], 'application/pdf'); await pdfFile.save(null, { useMasterKey: true }); // 关联到自定义对象(示例为Report对象,可替换为你自己的业务对象) const Report = Parse.Object.extend('Report'); const report = new Report(); report.set('pdfFile', pdfFile); report.set('creatorId', request.user.id); await report.save(null, { useMasterKey: true }); // 可选返回文件访问地址或对象ID return { fileUrl: pdfFile.url(), reportId: report.id }; });
注意事项
- 云函数中操作文件和业务对象时必须传
useMasterKey: true获取管理员权限 /tmp目录下的文件仅在当前云函数执行周期内有效,执行完成后会被自动销毁,不需要手动删除- 若使用puppeteer生成PDF,启动时需要添加
--no-sandbox和--disable-setuid-sandbox参数,否则会在Back4app环境中启动失败 - 生成的PDF大小不能超过当前套餐对应的Back4app单文件存储上限
内容的提问来源于stack exchange,提问作者bikashamit
相关产品推荐
相关产品推荐

