app.get('/api/advancedSearch/:id/:page_no/:exact_phrase?/:exclude_words?'
,function (req,res)
{ //body });
我正在尝试创建一个app.get,如上所示,我对前几个字段没有任何问题,问题出现在" exact_phrase"和"排除单词"领域。这些应该是列表,如果两个都通过,我没有问题。
导致问题的是,有时这些字段中的一个或两个可能不存在,我仍然需要得到它。我似乎无法为此设计app.get。
有没有办法设计app.get或发送请求以便我可以这样做?
答案 0 :(得分:3)
通常,URL的可选部分在查询字符串中工作得更好,因为它们可以自我识别哪些存在(因为它们是命名参数而不是仅由URL位置标识)。
Express路线匹配中的URL路径段是特定于订单的,您不能拥有任何您想要的可选参数序列,因为这对于传递的内容并不具有确定性。 Express路由匹配算法本身并不像您想要的那样灵活或强大。
您有几种选择:
将:exact_phrase
和:exclude_words
保留在路由定义之外,然后在路由处理程序中进行自己的URL解析,以确切了解其中的内容。通过这种方式,您可以调整为您想要的任何格式。
将所有可能采用不同顺序的参数或可选的参数作为查询参数,而不是URL中的路径段,然后使用req.query
查看URL中的确切内容。查询参数是可选的,可以按任何顺序排列。
最后一个选项是这样的:
// 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无法自动为您执行此操作。