azure Express应用程序未向客户端发送index.html文件

ilmyapht  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(100)

所以我的Express应用程序有一个小的节点服务器设置,这样当主路由'/'被命中时,它可以提供index.html文件。这是使用Azure的应用服务的一个要求,必须有这个server.js文件来告诉服务器如何提供客户端,我以前有一个这个工作的实现,但是我想改变我的文件结构。以前我有,文件夹client中的客户端React应用程序和文件夹server中的server.js沿着所有的控制器和路由。我已经将服务器API移动到它自己的应用程序中,因为有其他应用程序依赖于它。我将客户端向上移动一个目录到主目录中。一切都很好,直到有一天突然当你点击主页路径/时,它不会提供index.html文件。如果你点击任何其他路径,它工作,如果你甚至点击一个链接回主页的按钮,它工作,但是它不会从/提供应用程序,我一辈子都搞不清楚为什么,在我的开发服务器上,控制台上没有错误。我最肯定的目标是正确的目录和索引位置。但是它就像服务器没有阅读路由来提供服务。

if (process.env.NODE_ENV === 'production') {
  console.log('running');

  app.use(express.static(path.resolve(path.join(__dirname, 'build'))));
  // no matter what route is hit, send the index.html file
  app.get('*', (req, res) => {
    res.sendFile(path.resolve(path.join(__dirname, 'build', 'index.html')));
  });
} else {
  app.get('/', (req, res) => {
    res.send('API is running...');
  });
}

因此,我在这里说,如果NODE_ENVproduction中,使构建文件夹静态,然后无论什么路由都命中。(**注意:**我也尝试过这个应用程序。与其他路由格式,如/*/都有同样的问题。然而,在我以前的迭代中,当客户端和服务器部署在同一位置时,/*是我使用的。).env变量设置正确,因为当服务器运行时,它将控制台日志running..,但即使我把控制台日志放在server中,它也不会命中,除非我首先从其他地方访问路由。
例如,如果我将控制台日志放在app.get内,每当路由被命中时,状态为hit,直接命中/不起任何作用,但是如果我转到/login,它将在客户端上提供正确html,并在终端中提供控制台日志hit...

8fq7wneg

8fq7wneg1#

  • 如果你在客户端react应用程序中有服务器文件,那么我们基本上是在访问不在服务器文件中的文件。因此,我们可以使用以下代码提供静态文件:
const  express = require("express");
const  app = express(); // create express app
const  path = require('path');
app.use(express.static(path.join(__dirname, "..", "build")));
app.use(express.static("build"));
app.listen(5000, () => {
    console.log("server started on port 5000");
});

现在,在客户端react apppackages.json中,将scripts标记下的start标记名称更改为start-client。然后将以下标记添加到scripts标记中:

"start":"npm run build && (cd server && npm start)",

基本上,这将构建react应用程序并启动服务器。

此外,在服务器packages.json中,将以下标记添加到script标记下

"start":"node server.js"

因此,当您运行以下命令npm start时,它应该如下所示:

相关问题