【问题标题】:ExpressJS - Optional part of the URL which is not a param?ExpressJS - URL 的可选部分不是参数?
【发布时间】:2017-05-28 16:48:22
【问题描述】:

我有这样的路线:/products/123/versions/456

我希望子资源是可选的,所以我想要一个路由路径来处理/products/123/products/123/versions/456

这不起作用:/products/:pid/versions?/:vid?

如何在不使用:.. 的情况下将/versions/ 部分设为可选?

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    您可以创建一个命名处理程序并将其用于两条路线:

    function yourhandler(req, res) {
        // ...
    }
    app.get('/products/:pid', yourHandler);
    app.get('/products/:pid/versions/:vid', yourHandler);
    

    或者你可以使用正则表达式和可选部分。但这实际上是两条不同的路由,而不是一条,而且碰巧您想对它们使用相同的处理程序,因此使用两个 app.get()(或任何 HTTP 方法)路由定义是解决问题的最清晰方法.

    如果需要,也可以添加:

    app.get('/products/:pid/versions', yourHandler);
    

    【讨论】:

    • 谢谢...我试图避免两个,因为我实际上有router.route('/products/:pid/:versions?/:vid?').all(handler).get(handler).put(handler).delete(handler),它会重复两次(而且看起来很丑)...但如果这是最好的方法,那就这样吧。 ..
    【解决方案2】:
    app.get('/products/*',  (req, res, next){
    
    const path = req.path;
    
    //now use any logic on path as string
    
    if(path.includes('versions')){
    
    console.log('run version handler');
    
    }else{
    console.log('run else handler')}
    
    }
    
    //or const [product, version] = /\/products\/(.*)\/versions\/(.*)/.exec(path)
        }
    

    【讨论】:

    • 谢谢...我相信这行得通,尽管抓起一小块 url 并将其作为字符串处理会感觉有点混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    相关资源
    最近更新 更多