Все маршруты с сервера работают локально, но возвращают 404 при развертывании в heroku

#node.js #express #heroku #web-deployment #rest

Вопрос:

У меня есть сервер node/typescript, который работает как шарм в локальной разработке. Я развернул его в heroku через интерфейс командной строки. Все выглядит хорошо, релиз подтвержден, ошибок нет.

К сожалению, все маршруты, по которым я звоню с почтальоном или базовым клиентом js, возвращают 404. Я перепробовал все, что мог, но ничего не работает.

Вот сценарии package.json:

 "scripts": {
    "postinstall": "rimraf ./build amp;amp; tsc",
    "deploy": "git push -f heroku master",
    "dev": "nodemon",
    "start": "node build/index.js",
    "tsc": "tsc --noEmit"
  },
  "engines": {
    "node": "15.11.0",
    "yarn": "1.16.0"
  }
} 

Файл процесса:

 web: yarn start
// I have also tried: web: node build/index.js 

Файл index.ts:

 require("dotenv").config();
import express from "express";
import bodyParser from "body-parser";
import cors from "cors";
import { createServer } from "http";
import { Server } from "socket.io";
import connectToDatabase from "./database/connection";
import authRouter from "./routers/auth";
import userRouter from "./routers/user";

// Server
export const app = express();
const server = createServer(app);

// Middleware
app.use(cors({ credentials: true, origin: [process.env.CLIENT as string] }));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

// Routers
app.use(authRouter);
app.use(userRouter);

// Start
connectToDatabase()
  .then(() =>
    server.listen(process.env.PORT, () => {
      console.log(`server is listening on ${process.env.PORT}!`);
    })
  )
  .catch((err) => console.log("error", err)); 

Вот также файл tsconfig:

 {
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "lib": ["es6"],
    "allowJs": true,
    "outDir": "build",
    "rootDir": "src",
    "strict": false,
    "noImplicitAny": false,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "resolveJsonModule": true,
    "baseUrl": "./",
  },
  "exclude": ["node_modules", "build", "seeds"]
} 

Any route throws a 404 when I test it with Postman or go on the server url in my browser. I can’t reach anything with the url «https://my-app.herokuapp.com/blabla». With axios in a React app, I receive a network error. What is wrong with my deployment?