Search code examples
javascriptexpressaxios

How to render pdf in expressjs from axios response


I have a code like this:

const axios = require('axios');
const express = require('express');

const app = express();

app.get('/', async (request, response) => {
  const {
    params: { accountId },
  } = request;

  try {
    const { data } = await axios.get('https://pdfobject.com/pdf/sample.pdf');

    response.setHeader('content-type', 'application/pdf');
    response.setHeader('content-type', 'application/pdf');
    response.send(Buffer.from(data, 'binary'));
  } catch (error) {
    console.log(error.message);
  }
});

app.listen(3000, () => {
  console.log(`Server app listening on port 3000`);
});

enter image description here

Why expressjs render empty PDF file instead of https://pdfobject.com/pdf/sample.pdf?

Playground


Solution

  • You just need to modify this code, Set responseType to arraybuffer: This tells axios to handle the response as raw binary data instead of trying to parse it as JSON.

    By default in axios it is in JSON format

    const axios = require('axios');
    const express = require('express');
    
    const app = express();
    
    app.get('/', async (request, response) => {
      const {
        params: { accountId },
      } = request;
    
      try {
        // const { data } = await axios.get('https://pdfobject.com/pdf/sample.pdf');
        const { data } = await axios.get('https://pdfobject.com/pdf/sample.pdf', {
          responseType: 'arraybuffer',
        });
        response.setHeader('content-type', 'application/pdf');
        response.contentType('application/pdf');
        response.send(Buffer.from(data, 'binary'));
      } catch (error) {
        console.log(error.message);
      }
    });
    
    app.listen(3000, () => {
      console.log(`Server app listening on port 3000`);
    });
    
    

    Here is forked version working