【问题标题】:Generating a PDF when a document is created in Firebase Cloud Firestore在 Firebase Cloud Firestore 中创建文档时生成 PDF
【发布时间】:2020-07-08 14:02:18
【问题描述】:

我正在开发一个基于 Web 表单创建 PDF 的应用程序。

我目前正在尝试使用 pdfmake 基于 firestore 文档创建触发器生成 PDF

import * as functions from 'firebase-functions';
const admin = require('firebase-admin);
admin.initializeApp();
const PdfPrinter = require('pdfmake');
const fs = require('fs');

export const createPDF = functions.firestore
    .document('pdfs/{pdf}')
    .onCreate(async (snap, context) => {

        var pdfName  = context.params.pdf;
        var printer = new PdfPrinter();

        var docDefinition = {
        // Pdf Definitions
        };

        var options = {
        // Pdf Options
        };

        var pdfDoc = printer.createPdfKitDocument(docDefinition, options);
        pdfDoc.pipe(fs.createWriteStream('tempDoc.pdf'));
        await pdfDoc.end();


        // Upload to Firebase Storage
        const bucket = admin.storage().bucket('myproject.appspot.com');
        bucket.upload('tempDoc.pdf', {
            destination: pdfName + '.pdf',
        });

        return fs.unlinkSync('document.pdf');
    });

触发器被调用,但是我收到错误“错误:ENOENT:没有这样的文件或目录,stat 'document.pdf'”

我已经尝试过 onCreate 函数是异步的并且没有。

非常感谢任何帮助

【问题讨论】:

    标签: firebase google-cloud-firestore google-cloud-functions firebase-storage


    【解决方案1】:

    无法写入 Cloud Functions 中 /tmp 之外的任何文件位置。如果您的代码需要编写文件,则应按照documentation 中的说明从os.tmpdir() 构建路径:

    文件系统中唯一可写的部分是 /tmp 目录,它 您可以使用将临时文件存储在函数实例中。这是一个 本地磁盘挂载点,称为“tmpfs”卷,其中写入数据 到卷存储在内存中。注意会消耗内存 为该功能提供的资源。

    文件系统的其余部分是只读的,可供 函数。

    【讨论】:

    • 如果我将 tempDoc.pdf 更改为 path.join(os.tmpdir(), 'tempDoc.pdf'),我仍然收到错误“错误:ENOENT:没有这样的文件或目录,打开' /tmp/document.pdf'”。我为操作系统和路径添加了一个导入。
    • 您还忽略了异步 API 返回的所有承诺/回调。当所有异步工作完成时,您需要返回一个解决方案。
    猜你喜欢
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2018-01-02
    • 2021-03-29
    • 2018-09-09
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多