Использование обещаний с PDFMake в облачных функциях Firebase

Я использую PDFMake (вариант PDFKit) для создания PDF-файлов в облачных функциях Firebase с использованием триггера базы данных в реальном времени. Функция получает все соответствующие данные из базы данных, а затем передает их функции, которая должна генерировать PDF.

Все это делается с помощью обещаний. Все работает нормально до момента, когда PDF-файл действительно генерируется.

Вот код моего основного прослушивателя событий:

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}`);
  });
};

Чтобы создать PDF, вот мой код:

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();
  });
};

Что может быть не так в этом, что препятствует выполнению обещания и, следовательно, кавычки, который будет выполнен как задумано?

В журнале Firebase все, что я вижу, это Function execution took 3288 ms, finished with status: 'ok'

7 голосов | спросил Gaurav Wadhwani 6 12017vEurope/Moscow11bEurope/MoscowMon, 06 Nov 2017 21:13:07 +0300 2017, 21:13:07

2 ответа


0

Судя по времени выполнения и отсутствию ошибок, создается впечатление, что вы успешно создаете буфер для PDF, но фактически не возвращаете его из функции.

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

В приведенном выше коде вы передаете результат следующему блоку then, но затем возвращаете undefined из этого блока. Конечный результат этой цепочки обещаний будет неопределенным. Чтобы передать результат, вы должны вернуть его в конце цепочки обещаний:

.then((profile) => {
  return quotPdfHelper.generatePDF(fonts, profile, quotationData, storage);
})
.then(buffer => {
  console.log('Generation Successful. Pass for email');
  return buffer;
})
ответил rrowland 17 52017vEurope/Moscow11bEurope/MoscowFri, 17 Nov 2017 00:59:54 +0300 2017, 00:59:54
0

Я пытаюсь поэкспериментировать с генерацией pdf с помощью облачной функции firebase, но я заблокирован из-за определения параметра шрифтов. Вот мое определение:

var fonts = {
    Roboto: {
        normal: './fonts/Roboto-Regular.ttf',
        bold: './fonts/Roboto-Bold.ttf',
        italics: './fonts/Roboto-Italic.ttf',
        bolditalics: './fonts/Roboto-BoldItalic.ttf'
    }
};

Я создал папку шрифтов, которая содержит указанные выше файлы. Однако, где бы я ни установил папку шрифтов (в корне, в папке функций или в папке node_modules), я получаю ошибку «нет такого файла или каталога» при развертывании функций. Любой совет будет очень признателен.

ответил paugil 9 52018vEurope/Moscow11bEurope/MoscowFri, 09 Nov 2018 19:40:23 +0300 2018, 19:40:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132