DEV Community

Sakis Pal
Sakis Pal

Posted on

How to deploy a Node.js Express app on Netlify (2024)

Netlify does not make it easy to host an Express web app. I hope you will find this guide useful.

Steps

  • Structure your app in a similar way as the below:

Image description

  • Follow this guide https://docs.netlify.com/frameworks/express/ . I deleted node_bundler = "esbuild" because it threw an ESM error and everything worked fine regardless.
  • When creating the netlify.toml file keep redirects specific to the API and any endpoints you want to serve through Express. A general redirect (i.e. "/*") will mess up your CDN and static file serving.

Image description

  • (Optional) Use a local server file for development to keep things more tidy such as the image:

Image description

  • The package.json can look like this:

     "scripts": {
        "start": "node ./functions/server.js",
        "build": "netlify deploy --prod",
        "build-dev": "NODE_ENV=development webpack --mode development --watch",
        "dev": "NODE_ENV=development node server-local.js",
        "dev-watch": "NODE_ENV=development nodemon --exec node server-local.js",
    },
    
  • Write your server.mjs code such as the image:

Image description

  • Inside the index.html and the rest of the .html files the path to CSS, JS, and other assets is best set to the CDN which will work in both dev and production i.e.:

<link rel="stylesheet" href="https://my-app.netlify.app/css/styles.css">

  • Run netlify dev on the console to test before deployment

Key lessons

  • The server.js or server.mjs app only has access to /netlify/functions. The 'public' or 'dist' or 'static' folder will not be added to the netlify folder unless explicitly specified in the netlify.toml file using the command
[functions]
  included_files = [
    "static/views/**"  # Include all files in static/views for server-side access
  ] 
Enter fullscreen mode Exit fullscreen mode
  • Static assets are better served by Netlify's CDN, which will happen automatically if in the netlify.toml file you use the command
[build]
  publish = "static"  # Static assets to be served by Netlify's CDN. Folder defaults to public
Enter fullscreen mode Exit fullscreen mode
  • Console.log statements outside of router endpoints are not shown on the console.

Sentry blog image

How I fixed 20 seconds of lag for every user in just 20 minutes.

Our AI agent was running 10-20 seconds slower than it should, impacting both our own developers and our early adopters. See how I used Sentry Profiling to fix it in record time.

Read more

Top comments (0)

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

👋 Kindness is contagious

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay