使用Express设置React路由器

关于使用Express设置React,我有几个问题。

首先,我为Express和React-Router使用了相同的路由path。 我认为这些应该是匹配的。 但是,当我导航到一个页面,api / blogPosts时,它只显示了我从MongoDB中获取的JSON格式的数据。 也就是说,Express路线将覆盖React视图。 我知道我可以在React-Router中修改路由path(例如,前面没有'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); 

所以根据我的经验,React Router是用于单页应用程序的客户端路由。 这意味着它使用浏览器的历史API来使它看起来像浏览器将不同的路线,而不会离开原来的页面。 快速路由是服务器端路由,用于与某些API或数据库(如您所述)进行交互,或用于在该URL处提供新页面。

至于当你应该使用expressRouter vs app.get我会说尽可能使用路由器,因为这是一个很好的做法。 这里有一个相当不错的解释在Express中app.use()和router.use()之间的区别

现在最后,如果你想做服务器端渲染与反应路由器看这里: 客户端路由(使用react-router)和服务器端路由

您需要添加一个非API路线来为您的SPA(单页面应用程序)

创build另一个快速路由器,然后添加这个

 router.use('*',function(req,res,next){ var indexFile = path.resolve(__dirname,'./public/index.html'); res.sendFile(indexFile); 

})

或者你可以把index.html放在公共文件夹中,然后从该索引页面加载你的SPA。