Одна вещь, которую я заметил в вашем коде, заключалась в том, что вы не ожидаете разрешения вызова client.connect()
. Если вы не передадите обратный вызов функции, возвращается обещание, которое вы должны ждать.
Относительно генерации PDF-файлов:
У меня было аналогичное требование для генерации PDF-файлов из html некоторое время go и я в итоге использовал html-pdf
библиотеку .
Используя эту библиотеку, вы просто создадите поток преобразования и направите его в ответ. Примерно так (все еще требуется правильная обработка ошибок):
const html2pdf = require('html-pdf');
const getFormAsPDFByIdRoute = async(req, res) => {
const client = new Client(dbConfig);
await client.connect();
const result = await client.query(SQL `SELECT * FROM forms WHERE id = ${req.params.id}`);
if (!result.rowCount) {
return res.status(404).end();
}
const stream = await createHtlm2PdfStream(result.rows[0]);
res.contentType('application/pdf');
stream.pipe(res);
}
function createHtlm2PdfStream(html) {
return new Promise((resolve, reject) => {
html2pdf.create(html).toStream((err, stream) => {
if (err) {
return reject(err);
}
resolve(stream);
});
});
}
EDIT : как я предполагал, pdf должен был быть сгенерирован из html, но вместо этого должен быть создан pdf ручное использование pdfkit кажется правильным выбором:
const PDFDocument = require('pdfkit');
const getFormAsPDFByIdRoute = async(req, res) => {
const client = new Client(dbConfig);
await client.connect();
const result = await client.query(SQL `SELECT * FROM forms WHERE id = ${req.params.id}`);
if (!result.rowCount) {
return res.status(404).end();
}
const doc = new PDFDocument();
res.contentType('application/pdf');
doc.pipe(res);
// render some text (you can use .font(...) to alter the font style)
const formContent = result.rows[0];
doc.text(`Some text with the form id ${formContent.identifier}`, 100, 100);
doc.end();
}