使用 Express 设置 React 路由器
Posted
技术标签:
【中文标题】使用 Express 设置 React 路由器【英文标题】:Setting up React Router with Express 【发布时间】:2016-02-24 04:49:31 【问题描述】:我有几个关于使用 Express 设置 React 的问题。
首先,我对 Express 和 React-Router 使用了相同的路由路径。我认为这些应该匹配。但是当我导航到一个页面 api/blogPosts 时,它只显示了我从 MongoDB 获取的 JSON 格式的数据。也就是说,Express 路由覆盖了 React 视图。我知道我可以只修改 React-Router 中的路由路径(例如,前面没有'api'),以便有不同的路由。然后它将按预期显示 React 视图,同时仍然进行 api 调用。但同样,我认为路线路径应该匹配。我该如何正确处理?
其次,我使用了 express.Router(),但我不确定这是否必要。什么时候应该使用 express.Router(),什么时候应该只使用 app.get、app.post 等。
第三,当人们讨论客户端路由时,他们是在讨论 React Router 之类的东西吗?当人们讨论服务器端路由时,他们只是指像 apiRouter 调用那样对数据库进行 api 调用吗?
routes.js
<Route component=App>
<Route path='/' component=Home />
<Route path='/api/blogPosts/create' component=Create />
<Route path='/api/blogPosts/:blogPostId' component=BlogPost />
</Route>
server.js
var apiRouter = express.Router();
apiRouter.route('/blogPosts')
.post(function(req, res)
var blogPost = new BlogPost();
blogPost.postbody = req.body.postbody;
blogPost.save(function(err)
if (err)
return res.send(err);
res.json( message: blogPost.postbody + "created")
);
)
.get(function(req, res)
BlogPost.find(function(err, posts)
if (err) return res.send(err);
res.json(posts);
);
);
apiRouter.route('/blogPosts/:blogPostId')
.get(function(req, res)
BlogPost.findById(req.params.blogPostId, function(err, blogPost)
if (err) return res.send(err);
res.json(blogPost);
)
);
app.use('/api', apiRouter);
【问题讨论】:
【参考方案1】:所以根据我的经验,React Router 是用于单页应用程序的客户端路由。这意味着它使用浏览器的历史 API 来使浏览器看起来像是要转到不同的路线,而实际上却没有离开原始页面。快速路由是服务器端路由,用于与某些 API 或数据库进行交互,就像您提到的那样,或者用于在该 URL 处提供新页面。
至于何时应该使用 expressRouter 与 app.get,我想说尽可能尝试使用路由器,因为这是一种很好的做法。 Difference Between app.use() and router.use() in Express
这里有一个相当不错的解释最后,如果你想用 React 路由器进行服务器端渲染,请看这里:Client Routing (using react-router) and Server-Side Routing
【讨论】:
好的,这种帮助。但我仍然不知道我应该如何标记事物,因为 apiRouter 覆盖了我在 React Router 中使用的任何东西。【参考方案2】:您需要添加一个非 api 路由来为您的 SPA(单页应用程序)提供服务
创建另一个快速路由器,然后添加它
router.use('*',function(req,res,next)
var indexFile = path.resolve(__dirname,'./public/index.html');
res.sendFile(indexFile);
)
或者您可以将 index.html 放在您的公共文件夹中,然后从该索引页面加载您的 SPA。
【讨论】:
以上是关于使用 Express 设置 React 路由器的主要内容,如果未能解决你的问题,请参考以下文章
在 Netlify 上部署时使用 Express 公开 API 路由
如何使用 Node Express 路由处理 React Router
× React - fetch('/') 不会命中 Express.router 中的索引路由
Express - 使用 axios 返回具有命名路由参数的某些文档
如何在使用 Passport 进行社交身份验证后重定向到正确的客户端路由(react、react-router、express、passport)