所以我的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_ENV
在production
中,使构建文件夹静态,然后无论什么路由都命中。(**注意:**我也尝试过这个应用程序。与其他路由格式,如/*
或/
都有同样的问题。然而,在我以前的迭代中,当客户端和服务器部署在同一位置时,/*
是我使用的。).env
变量设置正确,因为当服务器运行时,它将控制台日志running..
,但即使我把控制台日志放在server
中,它也不会命中,除非我首先从其他地方访问路由。
例如,如果我将控制台日志放在app.get内,每当路由被命中时,状态为hit
,直接命中/
不起任何作用,但是如果我转到/login
,它将在客户端上提供正确html,并在终端中提供控制台日志hit
...
1条答案
按热度按时间8fq7wneg1#
现在,在客户端react app的
packages.json
中,将scripts
标记下的start
标记名称更改为start-client
。然后将以下标记添加到scripts
标记中:基本上,这将构建react应用程序并启动服务器。
此外,在服务器的
packages.json
中,将以下标记添加到script标记下因此,当您运行以下命令
npm start
时,它应该如下所示: