Не удается отправить PDF-файл из express в браузер или почтальону

#node.js #pdfkit

Вопрос:

 const PDF = require("pdfkit"); const fs = require("fs"); const express = require("express"); const app = express();  app.get("/", (req, res) =gt; {  try {  const doc = new PDF({ size: "A4" });   doc.image("/home/rahul/Desktop/projects/test/test/vlogo.png", 10, 0, {  width: 100,  height: 100,  align: "left",  });   doc.pipe(  fs.createWriteStream("/home/rahul/Desktop/projects/test/test/doc.pdf")  );  doc.end();  res.sendFile("/home/rahul/Desktop/projects/test/test/doc.pdf");  } catch (error) {  console.log(error);  res.status(500).sendFile("Rahul");  } });  

Приведенный выше код не отправляет никакого ответа браузеру.

Когда я загружаю API в браузер, я получаю это. рахул

Но когда я удаляю doc.pipe код, он работает нормально. Он отправляет PDF-файл.

Вы можете попробовать, прокомментировав

 // doc.pipe(  // fs.createWriteStream("/home/rahul/Desktop/projects/test/test/doc.pdf")  // );  

Ответ №1:

При вызове doc.end() pdf потребуется некоторое время для записи на диск. Таким образом, вы в основном отправляете «наполовину написанный» pdf-файл, который приводит к недействительному файлу. Поэтому дождитесь, пока созданное WriteStream завершится первым:

 const PDF = require("pdfkit"); const fs = require("fs"); const express = require("express"); const app = express();  app.get("/", (req, res) =gt; {  try {  const doc = new PDF({ size: "A4" });   doc.image("/home/rahul/Desktop/projects/test/test/vlogo.png", 10, 0, {  width: 100,  height: 100,  align: "left",  });   const stream = fs.createWriteStream("/home/rahul/Desktop/projects/test/test/doc.pdf")   stream.on('finish', () =gt; {  // now, the file is fully written to disk. Let's send it back!.  res.sendFile("/home/rahul/Desktop/projects/test/test/doc.pdf");  })   stream.on('error', err =gt; {  console.error(err)  res.status(500).send("Failed to send pdf.")  })   doc.pipe(stream);    // start writing to file!.  doc.end();    } catch (error) {  console.log(error);  res.status(500).send("Server error occured.");  } });