Search code examples
mongodbexpressheroku

Heroku error: 'cannot find module 'express'


I have created a node.js application that when deployed locally works perfectly fine locally but when I deploy it to heroku I get an error says "Error: Cannot find module 'express' -/app/server/server.js"

here is my server.js file

const express = require('express');
const db = require('./config/connection');
const PORT = process.env.port || 3001;
const app = express();
const mongoose = require('mongoose');
const cors = require('cors')
const routes = require('./routes');

app.use(express.json());
app.use(cors())
app.use(routes);

app.listen(PORT, () => {
    console.log(`API running on port ${PORT}`)
});

file structure

->client
->node_modules
->server
    ->config
       ->connection.js
    ->controllers
    ->models
    ->node_modules
    ->routes
    ->.env
    ->package-lock.json
    ->package.json
    ->server.js
->.gitignore
->package-lock.json
->package.json
->Procfile

here is my server/package.json

{
  "dependencies": {
    "bcrypt": "^5.1.0",
    "body-parser": "^1.20.2",
    "cors": "^2.8.5",
    "dotenv": "^16.0.3",
    "express": "^4.18.2",
    "mongoose": "^6.9.1",
    "multer": "^1.4.5-lts.1",
    "nodemon": "^2.0.20",
    "path": "^0.12.7"
  },
  "scripts": {
    "start": "node server.js",
    "devstart": "nodemon server.js"
  },
  "name": "server",
  "version": "1.0.0",
  "main": "server.js",
  "author": "",
  "license": "ISC",
  "description": ""
}

here is my package.json on root folder

"name": "blog-post-mongo",
  "version": "1.0.0",
  "description": "",
  "main": "server/server.js",
  "scripts": {
    "start": "node server/server.js",
    "test": "echo \"Error: no test specified\" && exit 1",
    "develop": "concurrently \"cd server && npm run devstart\" \"cd client && npm start\""
  },

procfile web: npm start

i have tried deleting node_modules and package-lock.json and reinstalling dependancies. I have also made sure that "express" is not capitalized on my files. Thanks!


Solution

  • Heroku only uses the package.json in your root directory.

    If you want to install dependencies from other directories, you need to create a build script in your root level package.json, e.g. something like this:

    "scripts": {
      "build": "npm --prefix server run build && npm --prefix client run build"
    }
    

    This assumes that you also have dependencies in a package.json in your client/ folder.