0

我有一个应用程序可以制作 PDF 并使用节点 js 将其发送给客户端。该应用程序在本地运行良好,但是当我将它托管在 Digital Ocean 的 Ubuntu 服务器中时,生成 PDF 的端点无法正常工作

这是将 PDF 发送到客户端的代码:

pdf.create(html, options).toStream((err, stream)=> {
            if (err) {
              res.json({
                message: 'Sorry, we were unable to generate pdf',
              });
            }
            stream.pipe(res)

          });

在客户端,这是我与端点通信的方式

  genratePdf({ commit }, data) {
    axios.post('http://localhost:1337/getpdf', data,{ responseType:'arraybuffer' }).then((response) => {
      let blob = new Blob([response.data],{type:'application/pdf'})
      var link=document.createElement('a');
      link.href=URL.createObjectURL(blob);
      link.download="Report_"+new Date()+".pdf";
      link.click();


    }, (err) => {
      console.log(err)
    })

当我在本地运行它时,它可以完美运行: 在此处输入图像描述

但是当我在 Ubuntu Digital Ocean droplet 中托管时,另一个端点工作但生成的 PDF 不工作,它向我显示错误 在此处输入图像描述

我认为这是一个超时问题,应用程序不会等待流完成以在 res 中传输它。

4

1 回答 1

1

在生成pdf时实际上发生了错误,但是由于您在处理错误时没有返回,它仍然执行该stream.pipe语句。

将您的代码更改为:

pdf.create(html, options).toStream((err, stream)=> {
   if (err) {
       console.error(err);
       return res.json({
           message: 'Sorry, we were unable to generate pdf',
       });
   }
   return stream.pipe(res)
});

请注意,我添加了一个console.error(err);,它可能会帮助您进一步调试。但我认为您正在使用的库使用 PhantomJS,它可能是一个错误,因为必须为拱编译 PhantomJS。

尝试做rm -Rf ./node_modules && npm i

于 2017-09-24T10:01:58.597 回答