【问题标题】:Reroute url | Nodejs | Express重新路由网址 |节点 |表达
【发布时间】:2016-10-03 13:27:33
【问题描述】:

我想根据请求中的查询参数将传入的请求重定向到不同的端点。

例如,

http://localhost:9000/?category=xyz&param1=...&param2=...

category 值可以是 [abc, ijk, pqr, xyz] 之一。

根据category 值,请求应重定向到“/abc”、“/ijk”、“/pqr”、“/xyz”之一保留剩余参数。

所以,上面的请求应该变成/xyz/?param1=...&param2=...

我是Nodejs/express的新手,我认为最好根据category值创建不同的路由来模块化代码。

处理此类情况的理想方法是什么?

【问题讨论】:

    标签: javascript node.js redirect express


    【解决方案1】:

    看起来像旧的“首页控制器”模式:

    app.get('/', routeByParameter)
    function routeByParameter(req, res){
      var category  = req.params.category
      if(category === 'abc'){
        return abcRoute(req, res)
      }
      else if(category === 'xyz'){
        return xyzRoute(req, res)
      }
    }
    function abcRoute(req, res){
      req.send('abc')
    }
    

    或者使用“首页术语”

    app.get('/', dispatcher)
    function dispatcher(req, res){
      var category  = req.params.category
      if(category === 'abc'){
        return viewAbc(req, res)
      }
      else if(category === 'xyz'){
        return viewXyz(req, res)
      }
    }
    function viewAbc(req, res){
      req.send('abc')
    }
    

    或者,您可以进入并在中间件中修改或创建自定义路由调度程序...

    【讨论】:

      【解决方案2】:

      为每个值[abc, ijk, pqr, xyz] 创建一个路由。为了处理不同的查询参数(?category=xyz),创建一个转换请求 url 的中间件:

      app.use(function(req, res, next) {
        // adding category in the url path will redirect to the 
        // correct route after calling next function
        req.url = "/" + req.query.category;
        next();
      });
      

      假设这是一个GET 请求,类别路由将是:

      app.get('/abc', function(req, res) {
        //do stuff for 'abc' category
        res.send('abc');
      });
      
      app.get('/ijk', function(req, res) {
        //do stuff for 'ijk' category
        res.send('ijk');
      });
      
      app.get('/pqr', function(req, res) {
        //do stuff for 'pqr' category
        res.send('pqr');
      });
      
      app.get('/xyz', function(req, res) {
        //do stuff for 'xyz' category
        res.send('xyz');
      });
      

      请注意,中间件会编辑所有请求的 url,通过请求 url 过滤添加路径 app.use("/path", function(req,res,next)... 或在其中添加一些逻辑。

      【讨论】:

      • 但我无法更改传入请求 url 的模式。它将始终采用我在问题中指定的格式。
      • 好的,我明白了。我将使用可能的解决方案编辑我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 2010-10-29
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多