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`);
});
Why expressjs render empty PDF file instead of https://pdfobject.com/pdf/sample.pdf
?
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