根据第一个参数调度Express.js路由?

时间:2013-12-14 09:19:55

标签: node.js express routing

我正在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”以便由相应的快递路由机制处理?

我开始认为这对于快速路线来说可能太复杂了,我将不得不手工完成。

谢谢!

1 个答案:

答案 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仅在初始化阶段调用