【问题标题】:PDF download fails using PDFMake in NodeJS在 NodeJS 中使用 PDFMake 下载 PDF 失败
【发布时间】:2020-04-15 17:43:17
【问题描述】:

我向我的 NodeJS API 添加了一个端点,以便能够使用库 PDFMake 生成和下载 PDF。我能够在服务器端生成和上传 PDF,但在浏览器站点上,PDF 被下载并失败,上面有 0 KB,我试图为它找到解决方案。 我知道该文件是在 writeStream 完成编写之前下载的,但添加了一个额外的功能,如下所示:

pdf.on("finish", async () => {
            res.download(pdf);
            res.send("PDF generated");
        });

这并没有帮助,而是添加了一个额外的错误:

UnhandledPromiseRejectionWarning: RangeError [ERR_HTTP_INVALID_STATUS_CODE]: Invalid status code: undefined

我不知道如何解决这个问题,希望得到帮助。很可能是我缺少的东西。

负责这些功能的代码是: 路由器

router.get("/pdf/all", async (req, res) => {
    const movies = await movie.getMovies();
    try {
        const pdf = await generatePdf(movies, "all");
        pdf.on("finish", async () => {
            res.download(pdf);
            res.send("PDF generated");
        });
    } catch (err) {
        // Errors
        res.status(err.status).json({ message: err.message });
        throw new Error(error.message);
    }
});

生成PDF

const generatePdf = (movies, name) => {
    return new Promise((resolve, reject) => {
        try {
            let fonts = {
                Roboto: {
                    normal: "Helvetica",
                    bold: "Helvetica-Bold",
                    italics: "Helvetica-Oblique",
                    bolditalics: "Helvetica-BoldOblique"
                }
            };
            let printer = new pdfMaker(fonts);
            const pdfTemplate = template(movies);
            const pdfStream = printer.createPdfKitDocument(pdfTemplate, {});
            const filePath = path.join(
                __dirname,
                uploads + "/" + pdfDir + `${name}.pdf`
            );
            console.log(filePath);
            pdfStream.pipe(writeStream(filePath));
            pdfStream.end();
            resolve(filePath);
        } catch (err) {
            console.log(err);
            reject(err);
        }
    });
};

【问题讨论】:

    标签: node.js pdfmake


    【解决方案1】:

    我建议你为generatePdf 尝试以下代码:

    const generatePdf = (movies, name) => {
        return new Promise((resolve, reject) => {
            try {
                let fonts = {
                    Roboto: {
                        normal: "Helvetica",
                        bold: "Helvetica-Bold",
                        italics: "Helvetica-Oblique",
                        bolditalics: "Helvetica-BoldOblique"
                    }
                };
                let printer = new pdfMaker(fonts);
                const pdfTemplate = template(movies);
                const pdfStream = printer.createPdfKitDocument(pdfTemplate, {});
                const filePath = path.join(
                    __dirname,
                    uploads + "/" + pdfDir + `${name}.pdf`
                );
                console.log(filePath);
                let stream = pdfStream.pipe(writeStream(filePath));
                stream.on('finish', function(){
                    pdfStream.end();
                    resolve(filePath);
                }
            } catch (err) {
                console.log(err);
                reject(err);
            }
        });
    };
    

    代码应等待pdfStream.pipe 完成后再完成文件,resolving filePath

    您也不能在res.download 之后使用res.send,因为下载会将响应设置为文件,您不能再向客户端发送另一个响应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      • 2021-06-16
      • 2021-01-07
      • 2016-11-09
      相关资源
      最近更新 更多