用多个字段表达app.get

时间:2016-06-24 19:42:11

标签: node.js http express

app.get('/api/advancedSearch/:id/:page_no/:exact_phrase?/:exclude_words?'
,function (req,res) 
{ //body });

我正在尝试创建一个app.get,如上所示,我对前几个字段没有任何问题,问题出现在" exact_phrase"和"排除单词"领域。这些应该是列表,如果两个都通过,我没有问题。

导致问题的是,有时这些字段中的一个或两个可能不存在,我仍然需要得到它。我似乎无法为此设计app.get。

有没有办法设计app.get或发送请求以便我可以这样做?

1 个答案:

答案 0 :(得分:3)

通常,URL的可选部分在查询字符串中工作得更好,因为它们可以自我识别哪些存在(因为它们是命名参数而不是仅由URL位置标识)。

Express路线匹配中的URL路径段是特定于订单的,您不能拥有任何您想要的可选参数序列,因为这对于传递的内容并不具有确定性。 Express路由匹配算法本身并不像您想要的那样灵活或强大。

您有几种选择:

  1. :exact_phrase:exclude_words保留在路由定义之外,然后在路由处理程序中进行自己的URL解析,以确切了解其中的内容。通过这种方式,您可以调整为您想要的任何格式。

  2. 将所有可能采用不同顺序的参数或可选的参数作为查询参数,而不是URL中的路径段,然后使用req.query查看URL中的确切内容。查询参数是可选的,可以按任何顺序排列。

  3. 最后一个选项是这样的:

    // url: /api/advancedSearch/123/4?exact_phrase=foo&exclude_words=cat,dog
    app.get('/api/advancedSearch/:id/:page_no/', function(req,res) {
        var excludeWords = [];
        if (req.query.exclude_words) {
            excludeWords = req.query.exclude_words.split(",");
        }
        var exactPhrase = req.query.exact_phrase || "";
    
        // do the rest of your processing here
    
    });
    

    仅供参考,从概念上讲,可选参数应该在queryString中,而不是在核心URL路径中。由于查询字符串参数是自我识别的,因此它使得存在哪些不明确,哪些不存在。如果URL中有可选的路径段,那么您必须以某种方式创建某种系统,以识别存在哪个路径段及其含义。由于这完全取决于应用程序和上下文,因此Express无法自动为您执行此操作。