javascript - React 服务器端只渲染特定的路由
问题描述
我目前有一个使用 EJS 构建的网站,并在 port 的后端使用 express 3300
。路由的结构如下所示:
localhost:3300
-/movies
-/rating
-/review
-/tvshows
-/rating
-/review
我目前在这样的路线中返回 EJS 文件:
router.get("/:title/rating", function(req, res) {
Movie.find({ movieName: req.params.title })
.exec(function(err, foundMovie) {
if (err) {
console.log(err);
} else {
console.log(foundMovie)
res.render("movie/rating", { movie: foundMovie});
}
});
});
但是现在,我想在使用 React 的结构中添加一个新路由,以便使用 React 构建以下内容:
localhost:3300
-/documentary
-/rating
-/review
据我了解,如果我想使用 React,我将不得不将我以前的所有路由(返回 EJS)重写为 React 组件,因为您无法合并两个服务器(React 和 Express,因为它们都在不同的端口上运行:3000
和3300
分别)。但是由于我已经写了这么多,我尝试按照本教程在服务器端呈现新路由,结果是:
router.get("/documentary", (req,res) => {
Documentary.find({}).exec(function(err,foundDoc){
if (err){
console.log(err);
} else {
fs.readFile(path.resolve("./views/react/client/build/index.html"), "utf-8", (err, data) => {
if (err) {
return res.status(500).send("Error");
}
return res.send(
data.replace(
'<div id="root"></div>',
`<div id="root">${ReactDOMServer.renderToString(<App />)}</div>`
)
);
});
}
})
});
App.js 看起来像:
function App() {
return (
<BrowserRouter>
<Switch>
<Route exact path="/rating">
<h1>Rating page for Documentaries</h1>
</Route>
<Route exact path="/review">
<h1>Review page for Documentaries</h1>
</Route>
</Switch>
</BrowserRouter>
);
}
我收到一个错误:
Error: Invariant failed: Browser history needs a DOM at invariant
如何修复错误?或者有没有更好的方法来结合 EJS 路由并创建新的 React 路由?提前致谢
解决方案
推荐阅读
- javascript - 将 typescript 类型和接口合二为一
- javascript - 变量显示在一个函数中,但没有另一个 Jquery
- dask - 如何从 dask 数组 (dd.from_dask_array) 创建 dask 系列
- vue.js - 更改输入文本值 vuex
- performance - 有没有更快的方法来找到有向无环图中顶点的最大属性 [持续时间] 的路径?
- javascript - ChartJS:空白页 | 出了什么问题?
- python - 尝试从另一个类更新时 Tkinter Canvas 上的错误
- python - 使用 pynamodb 库创建 dynamodb 记录时,“NoneType”对象不可迭代
- google-apps-script - 从 Google 电子表格(应用脚本或公式)获取单元格格式?
- ios - SwiftUI 决定放置逻辑的最佳 viewModel