处理可选的API查询字符串参数

时间:2018-03-17 01:21:44

标签: javascript

我正在使用React中的Github API,并且有一个表单允许用户从3个不同的类别中搜索存储库:文本(如在名称中包含该文本的任何存储库中),星号(如最小数量)明星)和许可证类型。

可以使用这3个类别的任意组合进行搜索。

所以我有以下api fetch函数:

const root = 'https://api.github.com/search/repositories?q='

export const githubSearch = (txt, starMin, license) => {
  return fetch(`${root}${txt}+stars:>=${starMin || 0}`)
    .then(res => {
      if (res.ok) {
        return res.json();
      }
      else {
        Promise.reject('Network failure')
      }
    })
}

这适用于文本和星形限定符,因为starMin可以设置为默认值0,如果text参数是空字符串,它将跳过它并转到星号限定符,但问题是的,许可证限定符需要具有'license:'的前缀,例如:

license:mit

在执行以下查询时,将许可证保留为空字符串会导致错误请求:

fetch(`${root}${txt}+stars:>=${starMin || 0}+license:${license}`)

处理此可选参数的首选方法是什么?我可以想到有几种黑客方法可以有条件地设置一个新变量,但这是一个主要的代码味道。

奖金问题:截至目前,如果txt字符串为空且发生的查询应该仅为星号最小值,则生成的网址应如下所示:

https://api.github.com/search/repositories?q=+stars:>=5

它有效,但根据文档,搜索星星的方式是这样的, + 之后 + < / p>

https://api.github.com/search/repositories?q=stars:>=5

这被认为是不好的做法吗?

1 个答案:

答案 0 :(得分:1)

您可以将它们放入数组并按+加入。如果没有价值,请不要放入阵列。这样,您就不会为不存在的值获得额外的+

const segments = []
if (txt) segments.push(`${txt}`)
if (license) segments.push(`license:${license}`)
segments.push(`stars:>=${starMin || 0}`)

fetch(`${root}${segments.join('+')}`)