Building a Simple Node.js App for Downloading PDFs using Express.js
Tags: webdev, javascript, beginners, tutorial
Published: 2023-10-12 15:22:24

## Building a Simple Node.js App for Downloading PDFs using Express.js

## Introduction

In this tutorial, we'll walk through the process of building a Node.js application using Express.js that allows users to download PDF files. This can be a useful feature for a variety of applications, from document management systems to educational platforms.

## Prerequisites

Before we get started, ensure you have the following prerequisites in place:

- [Node.js](https://nodejs.org/) and [npm](https://www.npmjs.com/) installed.
- Set up a project directory and initialize a Node.js project using `npm init`.

## Step 1: Project Setup

Create a new directory (app.js) for your project and initialize a Node.js project using the following command:

```shell
npm init
```

## Step 2: Install Dependencies

Install the necessary dependencies for your project. You can do this by running the following command:

```
npm i express
```
## Step 3: Setting Up the Express App

Create an Express application and set up a basic Express server. Here's the code for this step:

```javascript
const express = require('express');
const app = express();
const port = 3000;
const fs = require('fs');
```

## Step 4: Creating a Route for PDF Download

Create an Express route that handles PDF file downloads. Here's the code:
```javascript
app.get('/download-pdf', (req, res) => {
  const filePath = `./pdfs/java.pdf`;
});
```
Make sure you create a folder called `pdfs` add your own pdf file to it mine is called `java.pdf`

## Step 5: Check if the PDF File Exists
Use the `fs.existsSync` method to check if the PDF file exists in the specified directory. If the file doesn't exist, we will handle the file not found error.

```javascript
  if (!fs.existsSync(filePath)) {
    const notFoundError = new CustomError(404, 'PDF file not found');
    return next(notFoundError);
  }
```
## Step 6: Send the PDF File for Download
If the file exists, we can use the `res.download` method to send the PDF file for download. Here's the code for this step:
```javascript
  res.download(filePath, `java.pdf`, (err) => {
    if (err) {
      const downloadError = new CustomError(500, 'Error: Unable to download the PDF file');
      return next(downloadError);
    }
  });
});
```
## Step 7: Error Handling
Implement error handling to catch and respond to various errors, such as file not found or download errors. Here's how you can handle errors in your Express app:

```javascript
app.use((err, req, res, next) => {
  if (err instanceof customError) {
    res.status(err.statusCode).json({ error: err.message });
  } else {
    // Handle other errors
    res.status(500).json({ error: 'Internal Server Error' });
  }
});
```
## Step 8: Run the Application
Start your Node.js application with the following code:
```javascript
app.listen(port, () => {
  console.log(`App listening on port ${port}`);
});
```

Now you should have this --
```javascript
const express = require('express');
const app = express();
const port = 3000;
const fs = require('fs');

// Replace this with your actual PDF directory path
const pdfDirectory = './pdfs';

// Error handling class
class CustomError extends Error {
  constructor(statusCode, message) {
    super();
    this.statusCode = statusCode;
    this.message = message;
  }
}

// Middleware for error handling
app.use((err, req, res, next) => {
  if (err instanceof CustomError) {
    res.status(err.statusCode).json({ error: err.message });
  } else {
    res.status(500).json({ error: 'Internal Server Error' });
  }
});

app.get('/download-pdf', (req, res) => {
  const filePath = `${pdfDirectory}/java.pdf`;

  if (!fs.existsSync(filePath)) {
    const notFoundError = new CustomError(404, 'PDF file not found');
    return next(notFoundError);
  }

  res.download(filePath, `java.pdf`, (err) => {
    if (err) {
      const downloadError = new CustomError(500, 'Error: Unable to download the PDF file');
      return next(downloadError);
    }
  });
});

app.listen(port, () => {
  console.log(`App listening on port ${port}`);
});
```
Now you test or run your app `node app.js` you then use any browser {Chrome} of your choice to access this route `http://localhost:3000/download-pdf`

And That's It 🙏🙏🙏