How to deploy express.js server to Netlify

15,127

It's been a while, but here goes.

Netlify hosting is for the Jamstack, as they say, i.e. only static files, no processing on the server. The idea is to make use of other mechanisms to get your data dynamically, such as APIs hosted elsewhere, which you query straight from the browser, or when you build your site.

Most likely you actually had to deploy your express.js app as a Netlify Function, instead. Check Netlify's blog post on running express apps on their functions.

Share:
15,127
JS_is_awesome18
Author by

JS_is_awesome18

Updated on July 25, 2022

Comments

  • JS_is_awesome18
    JS_is_awesome18 almost 2 years

    I am attempting to deploy a Vue.js, Node, Express, MongoDB (MEVN) stack application to Netlify. I successfully deployed the front end of the application to Netlify, and am now attempting to deploy the express server, based on the following serverless-http example: https://github.com/neverendingqs/netlify-express/blob/master/express/server.js

    I configured my server to include the serverless-http package:

    server.js

    const express = require('express');
    const app = express();
    const serverless = require('serverless-http');
    const bodyParser = require('body-parser');
    const cors = require('cors');
    const mongoose = require('mongoose');
    const config = require('./DB.js');
    const postRoute = require('./routes');
    
    mongoose.connect(config.DB, { useNewUrlParser: true, useUnifiedTopology: true }).then(
      () => { console.log('Database is connected') },
      err => { console.log('Can not connect to the database'+ err)}
    );
    
    app.use(cors());
    app.use(bodyParser.urlencoded({extended: true}));
    app.use(bodyParser.json());
    
    app.use('/messages', postRoute);
    
    app.use('/.netlify/functions/server', router);  // path must route to lambda
    app.use('/', (req, res) => res.sendFile(path.join(__dirname, '../public/index.html')));
    
    
    module.exports = app;
    module.exports.handler = serverless(app);
    
    

    routes.js

    const express = require('express');
    const postRoutes = express.Router();
    
    // Require Post model in our routes module
    let Post = require('./post.model');
    
    // Defined store route
    postRoutes.route('/add').post(function (req, res) {
      let post = new Post(req.body);
      post.save()
        .then(() => {
          res.status(200).json({'business': 'business in added successfully'});
        })
        .catch(() => {
          res.status(400).send("unable to save to database");
        });
    });
    
    // Defined get data(index or listing) route
    postRoutes.route('/').get(function (req, res) {
        Post.find(function(err, posts){
        if(err){
          res.json(err);
        }
        else {
          res.json(posts);
        }
      });
    });
    
    module.exports = postRoutes;
    
    

    I then re-deployed my application to Netlify, but the server does not seem to run in Netlify. This server is in a folder in project root of my vue.js app. Should I instead run the server as a separate site in Netlify? If not, what should I do in order to get the server to run when deployed in Netlify?