Search code examples
node.jsvue.jstimeoutdigital-oceannode-streams

Sending a PDF from client to server isn't working with stream.pipe(res) in Ubuntu server


I have an application that makes a PDF and sends it to the client using node js. The application works perfectly locally but when I host it in a Ubuntu server in Digital Ocean, the endpoint that generates the PDF isn't working

This is the code that sends the PDF to the client :

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

          });

in the client side this how i communicate with the endpoint

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

When i run it locally it works perfectly: enter image description here

but when I host in a Ubuntu Digital Ocean droplet the other endpoint work but the generated PDF one is not working and it shows me that error enter image description here

I think it's a timeout problem the app does not wait for the stream to finish to pipe it in res.


Solution

  • There is actually an error occuring in the generation of your pdf but because you are not returning when handling error, it still executes the stream.pipe statement.

    Change your code to this :

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

    Notice I added a console.error(err);, it might help you to debug further. But I think the library you are using uses PhantomJS, might be an error with it as PhantomJS must be compiled for the arch.

    Try doing rm -Rf ./node_modules && npm i