2017-11-06 21 views
6

मैं रीयलटाइम डेटाबेस ट्रिगर का उपयोग कर फायरबेस क्लाउड फ़ंक्शंस पर पीडीएफ उत्पन्न करने के लिए पीडीएफमेक (PDFKit का एक संस्करण) का उपयोग कर रहा हूं। फ़ंक्शन डेटाबेस से सभी प्रासंगिक डेटा प्राप्त करता है और उसके बाद उसे पीडीएफ उत्पन्न करने वाले फ़ंक्शन पर भेज देता है।फायरबेस क्लाउड फ़ंक्शन पर पीडीएफमेक के साथ वादे का उपयोग

यह सब वादा का उपयोग करके किया जाता है। सब कुछ उस बिंदु तक ठीक काम करता है जब पीडीएफ वास्तव में उत्पन्न होता है।

यहाँ मेरी मुख्य घटना श्रोता में कोड है:

exports.generatePDF = (fonts, companyInfo, quotationData, storage) => { 
    const printer = new PdfPrinter(fonts); 
    const docDefinition = { 
    content: [ 
     { 
     text: [ 
      { 
      text: `${companyInfo.title}\n`, 
      style: 'companyHeader', 
      }, 
      `${companyInfo.addr_line1}, ${companyInfo.addr_line2}\n`, 
      `${companyInfo.city} (${companyInfo.state}) - INDIA\n`, 
      `Email: ${companyInfo.email} • Web: ${companyInfo.website}\n`, 
      `Phone: ${companyInfo.phone}\n`, 
      `GSTIN: ${companyInfo.gst_registration_number} • PAN: AARFK6552G\n`, 
     ], 
     style: 'body', 
     //absolutePosition: {x: 20, y: 45} 
     }, 
    ], 
    styles: { 
     companyHeader: { 
     fontSize: 18, 
     bold: true, 
     }, 
     body: { 
     fontSize: 10, 
     }, 
    }, 
    pageMargins: 20, 
    }; 
    return new Promise((resolve, reject) => { 
    // const bucket = storage.bucket(`${PROJECT_ID}.appspot.com`); 
    // const filename = `${Date.now()}-quotation.pdf`; 
    // const file = bucket.file(filename); 
    // const stream = file.createWriteStream({ resumable: false }); 
    const pdfDoc = printer.createPdfKitDocument(docDefinition); 
    // pdfDoc.pipe(stream); 

    const chunks = []; 
    let result = null; 

    pdfDoc.on('data', (chunk) => { 
     chunks.push(chunk); 
    }); 
    pdfDoc.on('error', (err) => { 
     reject(err); 
    }); 
    pdfDoc.on('end',() => { 
     result = Buffer.concat(chunks); 
     resolve(result); 
    }); 
    pdfDoc.end(); 
    }); 
}; 

यहाँ क्या गलत हो सकता है कि वादा और इस तरह उद्धरण रोक रहा है:

exports.handler = (admin, event, storage) => { 
    const quotationData = event.data.val(); 
    // We must return a Promise when performing async tasks inside Functions 
    // Eg: Writing to realtime db 
    const companyId = event.params.companyId; 
    settings.getCompanyProfile(admin, companyId) 
    .then((profile) => { 
    return quotPdfHelper.generatePDF(fonts, profile, quotationData, storage); 
    }) 
    .then(() => { 
    console.log('Generation Successful. Pass for email'); 
    }) 
    .catch((err) => { 
    console.log(`Error: ${err}`); 
    }); 
}; 

पीडीएफ उत्पन्न करने के लिए, यहाँ मेरा कोड यह है उद्देश्य के रूप में निष्पादित करने के लिए कोड?

firebase लॉग पर, सब मैं देख Function execution took 3288 ms, finished with status: 'ok'

उत्तर

3

निष्पादन समय और त्रुटियों की कमी के आधार पर है, ऐसा लगता है कि आप सफलतापूर्वक पीडीएफ के लिए बफर बना रहे हैं, लेकिन आप वास्तव में से यह नहीं लौटा रही हैं समारोह।

.then((profile) => { 
    return quotPdfHelper.generatePDF(fonts, profile, quotationData, storage); 
}) 
.then(() => { 
    console.log('Generation Successful. Pass for email'); 
}) 

उपरोक्त कोड में, आप अगले then ब्लॉक करने के लिए परिणाम गुजर रहे हैं, लेकिन फिर उस ब्लॉक से अपरिभाषित लौट रहे हों। इस वादा श्रृंखला का अंतिम परिणाम अपरिभाषित होगा। परिणाम को पारित करने के लिए, आप इसे वादा श्रृंखला के अंत में वापस करना चाहते हैं:

.then((profile) => { 
    return quotPdfHelper.generatePDF(fonts, profile, quotationData, storage); 
}) 
.then(buffer => { 
    console.log('Generation Successful. Pass for email'); 
    return buffer; 
}) 
संबंधित मुद्दे