Проблема обслуживания статических файлов с Node.js, иногда файлы найдены, иногда нет, как ее решить? - PullRequest
0 голосов
/ 20 ноября 2018

Я создал проект React с create-react-app с Node.js в качестве бэкэнда.Я передаю статические файлы с Node.js.

Я пытался выяснить это пару часов.Когда я запускаю в Docker и отправляю приложение в Heroku, я иногда получаю эту ошибку: Ошибка: ENOENT: нет такого файла или каталога, stat '/usr/src/app/server/build/index.html'

Это странно ?Если я нажимаю вокруг, все работает.Внезапно он не работает, и он говорит мне, что не может найти index.html?

И если я снова зайду на страницу и снова нажму вокруг, все работает.Почему это происходит?

Мой код для обслуживания статических файлов в файле node.js server.js:

// Serve static files if in production or running in docker
if ( process.env.NODE_ENV === "production" || process.env.NODE_ENV === "docker" ) {
  // Set static folder
  app.use("/", express.static("build"));

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

Структура моей папки:

Folder structure

И мои реактивные маршрутизаторы:

import Homepage from "./pages/Homepage";
import Dashboard from "./pages/Dashboard";
import Leaderboard from "./pages/Leaderboard";
import Signup from "./pages/Signup";
import Login from "./pages/Login";
import About from "./pages/About";
import Quiz from "./pages/Quiz";
import Locked from "./containers/Locked";

import WebSocketService from "./services/WebSocketService";

// Add the redux.dispatch function to WebSocketService
WebSocketService.setDispatch(store.dispatch);

ReactDOM.render(
  <Provider store={store}>
    <Router>
      <Switch>
        <Route exact path="/" component={Homepage} />
        <Route exact path="/signup" component={Signup} />
        <Route exact path="/login" component={Login} />
        <Route exact path="/about" component={About} />
        {/* Locked */}
        <Locked>
          <Route exact path="/leaderboard" component={Leaderboard} />
          <Route exact path="/dashboard" component={Dashboard} />
          <Route exact path="/play/:quizId" component={Quiz} />
        </Locked>
        {/* 404 */}
        <Redirect to="/" />
      </Switch>
    </Router>
  </Provider>,
  document.getElementById("root")
);

В режиме разработки все работает нормально, но на производстве я получаю эти проблемы.Когда я обновляю страницу в режиме разработки, я все еще на странице.Если я обновляюсь в производственном режиме, я также получаю ту же ошибку: Ошибка: ENOENT: нет такого файла или каталога, stat '/usr/src/app/server/build/index.html'

Есть линастроить я могу, чтобы избежать этого?Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Мое странное предположение, что app.use("/", express.static("build")); не работает так, как вы ожидаете.Попробуйте сделать это вместо этого:

const clientDir = path.resolve(__dirname, 'build')
app.use(express.static(clientDir))

Но это трудно догадаться.Я использую вышеупомянутое без проблем вообще.Это может не относиться к вашему варианту использования.Удачи.

0 голосов
/ 20 ноября 2018

Я решил проблему.

Новый код для обслуживания статических файлов.

// Serve static files if in production or running in docker
if ( process.env.NODE_ENV === "production" || process.env.NODE_ENV === "docker" ) {
  // Set static folder
  app.use(express.static(path.join(__dirname, '../build')));

  app.get('/*', (req, res) => {
    res.sendFile(path.join(__dirname, '../build', 'index.html'));
  });
}
0 голосов
/ 20 ноября 2018

I, не проверял, но вы обслуживаете статические файлы из папки build, а app.get обслуживает index.html из этой папки.Поэтому попробуйте:

if ( process.env.NODE_ENV === "production" || process.env.NODE_ENV === "docker" ) {
  // Set static folder
  app.use("/", express.static("build"));
}

Это как минимум экспресс-часть.Но я уверен, что маршрутизатор реагирует на изображение.

...