Игнорирование исключения из готовой функции с использованием PDFKit & GCF - PullRequest
0 голосов
/ 04 июня 2019

Так что в данный момент я пытаюсь сгенерировать PDF (используя Node.js, PDFKit и GCF) из ряда данных в моей базе данных Firebase.Одним из таких элементов является URL-адрес изображения, но для комплекта PDF это требуется в формате base64.На данный момент создается PDF, но я получаю около 6 вызовов «Игнорирование исключения из готовой функции».

Я думаю, что это связано с функцией base64, но я не могу прибитьтам, где проблема ... функция возвращает свои результаты после срабатывания onCreate, но я подумал, что "ожидание" предназначено, чтобы остановить это?Любая помощь / мысли?

 exports.onAppComplete = functions.database.ref("users/{appId}").onCreate((snapshot, context) =>{
            var appId = context.params.appId;
            var appDb = admin.database().ref(`Applications/${appId}`);
            return Promise.all([appDb.once('value'),appId]).then(([applicationDb, appId])=>{

                var application = {
                    appId:appId,
                    dogId:applicationDb.child("dogId").val(),
                    userId: applicationDb.child("appWith").val(),

                  };


                const Logo =  admin.database().ref(`users/logouri`);
                return Promise.all([Logo.once('value')]).then(([Logo])=>{
                    const PDFDocument = require('pdfkit');
                    let doc = new PDFDocument({ margin: 72 });
                       doc.size = [595.28, 841.89];
                       doc
                       .image('./images/logo.png', 50, 45, { width: 100 })
                         .fillColor("#444444")
                        .moveDown(1);
                        var logoUri = Logo.val();
                        console.log("pictureURL",logoUri);
                         toBase64(logoUri,50,50,doc);


                    const myPdfFile = admin.storage().bucket().file('/test/Arbeitsvertrag.pdf');
                    const stream = doc.pipe(myPdfFile.createWriteStream());
                    doc.end();
                    return console.log('Successfully made App PDF:', "OK");

                })
                 });
                });
          function toBase64(url, x, y, pdfdoc) {
                        return new Promise(async (resolve, reject)=>{
                            var https = require('https');
                            var req = await https.get(url, (res) => {
                                res.setEncoding('base64');
                                let body = "data:" + res.headers["content-type"] + ";base64,";
                                console.log("BODY", body)
                                res.on('data', (d) => {
                                    body += d;
                                });
                                res.on('end', () => {
                                    console.log("END", body)
                                    pdfdoc.image(body, x, y);
                                    resolve(res);
                                });
                            });
                            req.on('error', err => {
                                console.error('error!');
                                reject(err);
                            });

                        });

                    }

Я использую Node.js 8 и есть отдельный логотип, который загружается локально.

1 Ответ

0 голосов
/ 05 июня 2019

после некоторого запроса Дуга ... вот код, который отвечает на это, оказывается, что Promise.all является ключевым:

exports.onAppComplete = functions.database.ref("users/{appId}").onCreate((snapshot, context) =>{
            var appId = context.params.appId;
            var appDb = admin.database().ref(`Applications/${appId}`);
            return Promise.all([appDb.once('value'),appId]).then(([applicationDb, appId])=>{

                var application = {
                    appId:appId,
                    dogId:applicationDb.child("dogId").val(),
                    userId: applicationDb.child("appWith").val(),

                  };


                const Logo =  admin.database().ref(`users/logouri`);
                return Promise.all([Logo.once('value')]).then(([Logo])=>{
                    const PDFDocument = require('pdfkit');
                    let doc = new PDFDocument({ margin: 72 });
                       doc.size = [595.28, 841.89];
                       doc
                       .image('./images/logo.png', 50, 45, { width: 100 })
                         .fillColor("#444444")
                        .moveDown(1);
                        var logoUri = Logo.val();
                        console.log("pictureURL",logoUri);
                         return Promise.all([toBase64(logoUri),doc,application]).then(([logoURIBase64, doc, application])=>{

            doc.rect(0,0,590,70,40).fillAndStroke("#339999");
            doc.image(logoURIBase64,50,50,{width:100});
        const myPdfFile = admin.storage().bucket().file('/test/Arbeitsvertrag.pdf');
        const stream = doc.pipe(myPdfFile.createWriteStream());
        doc.end();
        return console.log('Successfully made App PDF:', "OK");

            });


                    const myPdfFile = admin.storage().bucket().file('/test/Arbeitsvertrag.pdf');
                    const stream = doc.pipe(myPdfFile.createWriteStream());
                    doc.end();
                    return console.log('Successfully made App PDF:', "OK");

                })
                 });
                });
          function toBase64(url) {
                        return new Promise(async (resolve, reject)=>{
                            var https = require('https');
                            var req = await https.get(url, (res) => {
                                res.setEncoding('base64');
                                let body = "data:" + res.headers["content-type"] + ";base64,";
                                console.log("BODY", body)
                                res.on('data', (d) => {
                                    body += d;
                                });
                                res.on('end', () => {
                                    console.log("END", body)
                                    pdfdoc.image(body, x, y);
                                    resolve(body);
                                });
                            });
                            req.on('error', err => {
                                console.error('error!');
                                reject(err);
                            });

                        });

                    }
...