如何从位于主函数内部的事件内部返回值?

时间:2019-04-05 08:53:55

标签: javascript google-cloud-functions pdfmake

我正在Google Cloud函数中创建一个函数,该函数应返回base64 pdf。我正在使用pdfmake库。使用console.log()可以看到base64正确生成,但是我无法将值返回给调用者。

PDF文档以.end()关闭,并触发事件.on('end')。问题是我似乎无法从事件内部返回值。

当我将return放入事件中时(目前是这样),firebase会等待并返回null。

如果我将返回值放在.end()之后,则返回的值为null,就好像该事件是异步的并且没有时间进行处理。

exports.pdf = functions.https.onCall((data, context) => {

    var PdfPrinter = require('pdfmake');
    var printer = new PdfPrinter(fonts);

    let fonts = {...};
    var docDefinition = {...};

    var pdfDoc = printer.createPdfKitDocument(docDefinition);

    let chunks = [];
    let pdfBase64 = null;

    pdfDoc.on('data', (chunk) => {
        chunks.push(chunk);
    });        

    pdfDoc.on('end', () => {
        const result = Buffer.concat(chunks);
        pdfBase64 = 'data:application/pdf;base64,' + result.toString('base64');
        console.log(pdfBase64);
        return {pdfBase64: pdfBase64};
    });


    pdfDoc.end();



});

如何返回值?

1 个答案:

答案 0 :(得分:0)

您需要返回一个承诺,该承诺最终将与数据一起解析以发送给客户端。尝试这样的事情:

// everything above stays the same

const p = new Promise((resolve, reject) => {
    pdfDoc.on('end', () => {
        const result = Buffer.concat(chunks);
        pdfBase64 = 'data:application/pdf;base64,' + result.toString('base64');
        console.log(pdfBase64);
        resolve({pdfBase64: pdfBase64});
    });
})

pdfDoc.end();

return p;