Sling Academy
Home/Node.js/Express JS: How to Serve Images & Static Files

Express JS: How to Serve Images & Static Files

Last updated: January 01, 2024

Introduction

Express.js simplifies the process of serving static files, including images, CSS, JavaScript files, and more. Managing these resources efficiently is crucial to ensure a fast and responsive web application.

Setting up Express

To start serving static files, you need to have Node.js and Express.js installed. Once installed, you can create a simple Express server:

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

app.listen(3000, function() {
  console.log('Server running on port 3000');
});

Serving a Single Image

To serve a single image, you can define a route and send the image file as a response:

app.get('/image', function(req, res) {
  res.sendFile('/path/to/image.jpg');
});

Using express.static Middleware

The express.static built-in middleware function is a better way to serve static files. You can use it to specify a directory that contains your assets:

app.use(express.static('public'));

Now, all files in the ‘public’ directory will be accessible via the web browser. For example, if there is ‘image.jpg’ in the ‘public’ folder, access it through http://localhost:3000/image.jpg.

File Path Resolution

Important to note: express.static middleware serves the files directly from the directory specified, relative to the directory where the command to start your node application was issued. This might not be where your script resides, so always consider using a path module to resolve file paths:

const path = require('path');
app.use(express.static(path.join(__dirname, 'public')));

Setting Cache-Control Headers

To optimize loading times and reduce server load, you can set Cache-Control headers for your static files:

const express = require('express');
const app = express();
const path = require('path');

app.use('/static', express.static(path.join(__dirname, 'public'), {
  maxAge: '1d'
}));

This will tell browsers to cache files for 1 day.

Serving Multiple Static Directories

You can also serve multiple static directories, each with its own express.static call:

app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'files')));

Now your server will serve static files from both ‘public’ and ‘files’ directories.

Virtual Path Prefixes

If you want to serve your files on a path that doesn’t correspond with the actual directory structure on your server, use a virtual path prefix:

app.use('/virtual', express.static('public'));

This will serve files from the ‘public’ folder at paths starting with ‘/virtual’.

Handling Errors for Static Files

It’s possible that requests for static files will result in errors. You should handle errors appropriately, like setting up a 404 error handler:

app.use(function (req, res, next) {
  res.status(404).send("Sorry can't find that!")
});

Optimizing Performance with Compression

Using compression middleware can greatly improve response times for serving static files. Install the ‘compression’ package and include it in your app:

const compression = require('compression');
app.use(compression());
app.use(express.static('public'));

Securing Static Files

While serving static files publicly is the norm, you might sometimes need to serve them to authenticated users only. In such cases, consider strengthening security by setting custom middleware:

const express = require('express');
const app = express();
const path = require('path');

function checkAuth(req, res, next) {
  // your authentication logic here
  next();
}

app.use('/secured', checkAuth, express.static(path.join(__dirname, 'secure')));

This way, the ‘/secured’ path will serve static files only if the user is authenticated.

Using Environment Variables

You can also enhance your static files serving setup by using environment variables to change behavior, like switching cache duration for different environments:

const express = require('express');
const app = express();
const path = require('path');

const cacheTime = process.env.CACHE_DURATION || '1d';

app.use(express.static('public', { maxAge: cacheTime }));

Custom Error Pages for Static Content

To serve custom error pages, for instance, a custom 404 page, set up a middleware function after your static files middleware:

app.use(express.static('public'));

app.use((req, res) => {
  res.status(404).sendFile('/path/to/404.html');
});

Conclusion

Express.js provides a robust set of features to manage and serve static files, such as images, efficiently and securely. By implementing the techniques discussed, you can significantly enhance the user experience and performance of your web applications.

Next Article: How to Render HTML Views in Express.js

Previous Article: Node & Express: Block incoming requests by user agent

Series: Node.js & Express Tutorials

Node.js

You May Also Like

  • NestJS: How to create cursor-based pagination (2 examples)
  • Cursor-Based Pagination in SequelizeJS: Practical Examples
  • MongooseJS: Cursor-Based Pagination Examples
  • Node.js: How to get location from IP address (3 approaches)
  • SequelizeJS: How to reset auto-increment ID after deleting records
  • SequelizeJS: Grouping Results by Multiple Columns
  • NestJS: Using Faker.js to populate database (for testing)
  • NodeJS: Search and download images by keyword from Unsplash API
  • NestJS: Generate N random users using Faker.js
  • Sequelize Upsert: How to insert or update a record in one query
  • NodeJS: Declaring types when using dotenv with TypeScript
  • Using ExpressJS and Multer with TypeScript
  • NodeJS: Link to static assets (JS, CSS) in Pug templates
  • NodeJS: How to use mixins in Pug templates
  • NodeJS: Displaying images and links in Pug templates
  • ExpressJS + Pug: How to use loops to render array data
  • ExpressJS: Using MORGAN to Log HTTP Requests
  • NodeJS: Using express-fileupload to simply upload files
  • ExpressJS: How to render JSON in Pug templates