我正在node.js和Express中创建CMS。我允许用户在站点中创建自己的子部分。子部分可以是博客,页面或论坛。这些子部分可以安装在站点URL路径的一个深层,例如:
domain.com/custom-path-blog/
我必须使用快速路线支持以下网址结构:
domain.com/custom-path-blog/ -> blog index
domain.com/custom-path-blog/page/5 -> list posts on page 5
domain.com/custom-path-blog/guides/ -> list posts that belong to guides category
domain.com/custom-path-blog/guides/this-is-a-post -> shows a post
我还必须支持具有不同url结构的其他子部分。我必须调用数据库来检查url中的第一级实际上是什么,然后才能将它发送到适当的路由。
由于这是一个saaas网站,我不想在我的节点进程上动态注册路由,因为我最终可能有成千上万的用户可能有数百万条路由。这是不可行的。我必须去数据库获取第一大块信息。
一旦我知道某个子部分是博客或论坛或电子商务商店,我如何将该网址发送到“custom-path-blog”以便由相应的快递路由机制处理?
我开始认为这对于快速路线来说可能太复杂了,我将不得不手工完成。
谢谢!
答案 0 :(得分:2)
如果您已经有3个独立的应用程序(页面,博客,论坛),并且您希望在1节点进程中启动它,则可以执行此操作:
app.use('/page', pageApp);
app.use('/blog', blogApp);
app.use('/forum', forumApp);
express会为你删除网址的第一个组成部分。
在您的情况下,第一个组件是由用户自定义的,因此您需要为其编写中间件:
function appSelector(req, res, next) {
var firstComponent = getFirtCompoent(req.url.pathname) // return page or blog ...
var userID = req.user.id;
detectAppForCurrentUser(firstCompoent, userID, function (type) {
if(type === 'page') {
removeFirstComponent(req);
return pageApp(req, res, next);
}
if(type === 'blog') {
removeFirstComponent(req);
return blogApp(req, res, next);
}
next(); // if not found continue with other routes
}
}
app.use(appSelector);
// TODO other routes here
有很多方法可以解决问题,但这是重要的规则: app.use,app.get仅在初始化阶段调用