我已经创建了一个CRA应用程序,并有两条快速路线来加载CRA构建文件,例如:
app.get('/files', async (req, res, next) => {
...
try {
res.format({
html: function() {
const fileLoc = './public/react_ui/build/index.html';
const stream = fs.createReadStream(path.resolve(fileLoc));
stream.pipe(res);
}
});
} catch (e) {
next(e);
res.redirect(SEE_OTHER.http_status, '/login');
}
});
在添加CRA之前,Express应用程序公开了/public
文件夹,如下所示:
// access to express App code files
app.use(express.static(__dirname + '/public'));
现在我已经嵌入了CRA应用程序,我想公开这样的构建文件,否则通过构建index.html
创建的CRA
文件不知道/static/js/*
的位置:
// access to React App build files
app.use(express.static(__dirname + '/public/react_ui/build'));
但是,它会中断快速路由。例如,当我注销该应用程序时,它应该将我发送到端点/
,这将检查我是否登录,如果没有登录,那么它应该将我发送到登录页面,例如这个:
app.get('/', function(req, res) {
...
isLoggedIn(req, function(status) {
switch (status.status) {
case 200:
res.redirect(303, '/loader');
break;
default:
res.redirect(303, '/login');
}
});
});
但是,这就是中断。如果删除命令以暴露上面的/build
文件夹,则路由将再次起作用,并且将我发送到登录页面,但是由于构建文件为NOT FOUND
,因此访问CRA页面时会中断。 >
// access to React App build files - if removed, routing works again
app.use(express.static(__dirname + '/public/react_ui/build'));
有人为什么会这样吗?我不知道这是应用程序问题,快递问题还是其他问题。任何见解都会有所帮助。
答案 0 :(得分:1)
您的路线有冲突。
app.js
app.use('/', express.static(__dirname + 'path/to/static/build'));
// Dont use '/' as it used for static route.
app.use('/auth', (req, res) => {
...
isLoggedIn(req, function(status) {
switch (status.status) {
case 200:
res.redirect(303, '/loader');
break;
default:
res.redirect(303, '/login');
}
});
})
请注意,您可以使用任何路由进行静态构建。我已经给出了常规。