使用Node.js服务静态文件时遇到问题,有时找到文件,有时找不到,该如何解决?

时间:2018-11-20 09:08:32

标签: node.js reactjs heroku static-files

我用# libraries import pandas as pd import numpy as np import networkx as nx import matplotlib.pyplot as plt # Build your graph G=nx.from_pandas_dataframe(df, 'src', 'dest',create_using=nx.DiGraph()) # Plot it nx.draw(G, with_labels=True) plt.show() 创建了一个React项目,其中Node.js作为后端。我通过Node.js提供静态文件。

我试图弄清楚几个小时。当我在docker中运行并将应用程序推送到Heroku时,有时会出现此错误:错误:ENOENT:没有这样的文件或目录,stat'/usr/src/app/server/build/index.html'

那很奇怪吗?如果我单击一下,一切正常。突然无法正常运作,并告诉我找不到create-react-app吗?

如果我再次进入该页面并再次单击四周,则一切正常。为什么会这样?

我用于在node.js index.html文件中提供静态文件的代码:

server.js

我的文件夹结构:

Folder structure

我的反应路由器:

// 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"));
  });
}

在开发模式下,一切正常,但是在生产中,我遇到了这些问题。当我以开发模式刷新页面时,即时消息仍在页面上。如果我在生产模式下刷新,也会收到相同的错误:错误:ENOENT:没有此类文件或目录,stat'/usr/src/app/server/build/index.html'

我可以做些调整来避免这种情况吗?感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

我,尚未测试它,但是您正在从build文件夹提供静态文件,而app.get从该文件夹提供了index.html。因此,尝试:

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

至少这是明确的部分。但是我不知道反应路由器如何适应图片。

答案 1 :(得分:0)

我的疯狂猜测是 app.use("/", express.static("build"));不能按预期工作。尝试这样做:

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

但是很难猜测。我使用上面没有任何问题。它可能不适用于您的用例。祝你好运。

答案 2 :(得分:0)

我解决了这个问题。

用于提供静态文件的新代码。

// 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'));
  });
}