Как устранить ошибку «страница не найдена» в heroku после развертывания

#node.js #express #heroku

#node.js #экспресс #heroku

Вопрос:

Я пытаюсь загрузить express/node.js приложение для heroku. Приложение успешно развернуто, но когда я пытаюсь получить доступ к URL, я получаю ошибку: не найдено.

Когда я запускаю heroku logs —tail, я получаю:

 Error: ENOENT: no such file or directory, stat '/client/build/index.html'
  

итак, я думаю, что я делаю что-то не так с каталогами и папкой statics

это мой server.js файл:

 const express = require("express");
const mongoose = require("mongoose");
const bodyParser = require("body-parser");
const passport = require("passport");
const cors = require("cors");
const path = require("path");

const users = require("./routes/api/users");
const profile = require("./routes/api/profile");
const matches = require("./routes/api/matches");

const app = express();

//body-parser middleware
app.use(bodyParser.urlencoded({ extended: false, limit: "50mb" }));
app.use(bodyParser.json({ limit: "50mb" }));

//db config
const db = require("./config/keys").mongoURI;

//cors
app.use(cors());

//connect to mongoose
mongoose
 .connect(db, { useNewUrlParser: true })
 .then(() => console.log("MongoDB connected"))
 .catch(err => console.log(err));

//Passport middleware
app.use(passport.initialize());

app.use("/images", express.static(path.join(__dirname   "/images")));

//Passport config
require("./config/passport")(passport);

//Use route
app.use("/api/users", users);
app.use("/api/profile", profile);
app.use("/api/matches", matches);

//Serve static assets if in production
if (process.env.NODE_ENV === "production") {
  app.enable("trust proxy");

  //Set static folder
  app.use(express.static(path.join(__dirname, "/../client/build")));

  app.get("*", (req, res) => {
    res.sendFile(path.join(__dirname   "/../client/build/index.html"));
  });
}

const port = process.env.PORT || 5000;

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

Я также включаю изображение папок «позиции»папки

Ответ №1:

Я решил эту проблему, определив команду сборки и установки в моем package.json. Heroku искал бы там команду сборки для производства.

 "scripts": {
    "build": "cd client amp;amp; npm run build",
    "install": "cd client amp;amp; npm install",
    "start": "node server",
    "server": "nodemon server",
    "client": "npm start --prefix client",
    "dev": "concurrently "npm run server" "npm run client""
  },
  

Ответ №2:

Я думаю, что это должно быть так

 app.use("/images", express.static(path.join(__dirname, "images")));
  

Редактировать: На самом деле ваше приложение ожидает найти файл по адресу /../client/build/index.html , но этот файл не существует (что и означает ошибку ENOENT). Итак, вам либо нужно создать ожидаемую структуру каталогов, либо настроить ваше приложение таким образом, чтобы оно выглядело в правильном каталоге для index.html . Теперь я это понимаю, надеюсь, это поможет вам.

Комментарии:

1. Я пытался воспользоваться вашим предложением, но проблема все еще существует. Я загружаю приложение и получаю не найденную страницу

Ответ №3:

Я также получил аналогичную ошибку. Для меня проблема в том, что у меня неверный скрипт для сборки в файле package.json, поэтому сборка вообще не создается.

Убедитесь, что у вас есть скрипт «heroku-postbuild», как показано ниже в файле package.json.

 "scripts": {
"start": "node server.js",
"server": "nodemon server.js",
"client": "npm start --prefix client",
"clientinstall": "npm install --prefix client",
"dev": "concurrently "npm run server" "npm run client"",
"heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install --prefix client amp;amp; npm run build --prefix client" 
},