【问题标题】:Dispatch Express.js route based on first parameter?根据第一个参数调度 Express.js 路由?
【发布时间】:2013-12-14 09:19:54
【问题描述】:

我正在 node.js 和 Express 中创建一个 CMS。我允许用户在站点中创建自己的子部分。小节可以是博客、页面或论坛。这些子部分可以安装在站点 url 路径的一层深处,例如:

domain.com/custom-path-blog/

我必须支持以下带有快速路由的 url 结构:

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 网站,我不想在我的节点进程上动态注册路由,因为我最终可能会拥有数以百万计的路由的数千名用户。这是不可行的。我必须去数据库获取第一块信息。

一旦我知道子版块是博客、论坛或电子商务商店,我如何将 url 发送到“custom-path-blog”以由适当的快速路由机制处理?

我开始认为这对于快速路线来说可能太复杂了,我必须手动完成。

谢谢!

【问题讨论】:

    标签: node.js express routing


    【解决方案1】:

    如果您已经有 3 个独立的应用程序(页面、博客、论坛),并且您想在 1 个节点进程中启动它,您可以这样做:

    app.use('/page', pageApp);
    app.use('/blog', blogApp);
    app.use('/forum', forumApp);
    

    express 会为你去掉 url 的第一个组成部分。


    在您的情况下,第一个组件是由用户自定义的,因此您需要为它编写一个中间件:

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

    【讨论】:

    • 感谢您的精彩回答。初始化阶段是什么意思?每次请求都会调用 appSelector 函数吗?问候。
    • 初始化阶段意味着当你启动进程时,它应该在 app.listen 之前调用。 appSelector 将在每个请求上被调用,但如果有更高优先级的中间件调用 res.end() 则不会调用它
    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 2023-04-08
    • 2013-05-24
    • 2012-04-18
    • 1970-01-01
    • 2020-08-04
    • 2018-11-09
    • 2020-08-09
    相关资源
    最近更新 更多