Вопрос или проблема
Репозиторий приложения: https://github.com/calebkish/DevConnector
Для начала, мое веб-приложение было выложено на Heroku.
Я пытаюсь успешно собрать свое веб-приложение MERN на Heroku, но когда я посещаю страницу своего приложения (https://safe-fortress-83003.herokuapp.com/), оно возвращает ошибку “Не найдено” из корневого GET-ответа. Когда я просматриваю журналы своего приложения Heroku, эта ошибка отображается, когда отправляется корневой запрос:
Error: ENOENT: нет такого файла или каталога, stat '/app/client/build/index.html'
Итак, я зашел в свой локальный CLI и выполнил heroku run bash
, просмотрел текущие файлы и каталоги и обнаружил, что /app/client/build/ не существует. Это приводит меня к мысли, что он не генерируется с помощью моего скрипта heroku-postbuild, определенного в моем package.json (не знаю, почему он не выполняется, когда я git push heroku master
). В отчаянии я выполнил npm install && npm run build
внутри своей папки клиента (где находится мое приложение на React), и теперь папка сборки, содержащая index.html, находится на моем приложении Heroku. Однако, когда я пытаюсь просмотреть приложение, я все еще получаю ошибку “Не найдено”.
Я пытаюсь отладить это уже несколько часов, не знаю, в чем проблема. Статические файлы (папка сборки) определены внутри server.js, если вы хотите взглянуть.
ИЗМЕНИТЕ: Я только что удалил build из .gitignore и выложил на heroku, и теперь мое приложение работает. Так что главная проблема в том, что мой скрипт heroku-postbuild не выполняется, хотя имя четко указано в этой документации: https://devcenter.heroku.com/articles/nodejs-support
У меня есть решение для этой конкретной проблемы. Сначала создайте папку с именем приложения и разместите в ней папку клиента, затем перейдите к файлу server.js.
if (process.env.NODE_ENV) {
//добавить статическую папку
app.use(express.static('app/client/build'));
app.get("*", function (req, res) {
res.sendFile(path.resolve(__dirname , "app/client/build", "index.html"));
});
}
После этого измените файл package.json.
"scripts": {
"start": "node server.js",
"server": "nodemon server.js",
"heroku-postbuild": "cd app && cd client && npm install --only=dev && npm
install && npm run build"
},
После этого запустите свой файл, он будет работать нормально.
Ответ или решение
Ошибка Heroku: ENOENT: no such file or directory, stat ‘/app/client/build/index.html’ — это распространённая проблема, с которой могут столкнуться разработчики при развертывании MERN-приложений. Давайте детально разберёмся с этой ошибкой и различными шагами её решения.
1. Понимание проблемы
Когда вы видите ошибку "ENOENT: no such file or directory", это указывает на то, что сервер не может найти указанный файл или директорию. В вашем случае это означает, что файл index.html
в директории /app/client/build
отсутствует, что, в свою очередь, приводит к ошибке 404 при обращении к приложению.
2. Причины проблемы
Существует несколько возможных причин, по которым ваш файл не был сгенерирован или не оказался в нужном месте на Heroku:
-
Heroku-postbuild скрипт не выполняется. Обычно Heroku автоматически запускает данный скрипт после установки зависимостей, чтобы скомпилировать приложение. Однако, если в
package.json
есть ошибки или неправильные пути, этот процесс может завершиться неудачей. -
Неверные пути в серверном коде. Если сервер неправильно настроен для указания на статические файлы, даже если они существуют, приложение не сможет их найти.
-
Проблемы с .gitignore. Если
build
директория добавлена в.gitignore
, Heroku не сможет её получить при развертывании.
3. Решение проблемы
Проверка скрипта heroku-postbuild
-
Убедитесь, что скрипт
heroku-postbuild
в вашемpackage.json
корректен:"scripts": { "start": "node server.js", "heroku-postbuild": "cd client && npm install && npm run build" }
Этот скрипт должен перейти в папку клиента, установить зависимости и собрать проект.
Проверка структуры каталогов
-
Правильная структура папок имеет жизненно важное значение. Убедитесь, что у вас правильная иерархия:
/app /client /build index.html server.js
Если структура отличается, может потребоваться изменение пути к статическим файлам в
server.js
:if (process.env.NODE_ENV === 'production') { app.use(express.static(path.join(__dirname, 'client/build'))); app.get('*', (req, res) => { res.sendFile(path.join(__dirname, 'client/build', 'index.html')); }); }
Уберите build из .gitignore
- Если вы обнаружили, что директория
build
была в.gitignore
, уберите её оттуда. Однако, это может не быть оптимальным решением, так какbuild
и её содержание должны генерироваться автоматически.
Ручное развертывание
-
Если автоматизированный процесс не сработал, вы можете вручную собрать проект. Войдите на Heroku и выполните следующую команду:
heroku run bash cd client npm install npm run build
После этого вернитесь к корневой директории и перезапустите сервер.
Заключение
Решение проблемы ENOENT: no such file or directory требует комплексного подхода: необходимо убедиться, что ваш проект правильно настроен, пути указаны верно, и скрипты без ошибок. Следуя вышеизложенным шагам, вы сможете устранить данную проблему и успешно развернуть ваше MERN-приложение на Heroku.