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

Javascript 处理可选API查询字符串参数,javascript,Javascript,我在React中使用Github API,并且有一个表单,允许用户从3个不同类别搜索存储库:文本(就像在名称中包含该文本的任何存储库中一样)、星星(就像最小星星数一样)和许可证类型 可以使用这三个类别的任意组合进行搜索 因此,我有以下api fetch函数: const root = 'https://api.github.com/search/repositories?q=' export const githubSearch = (txt, starMin, license) =>

我在React中使用Github API,并且有一个表单,允许用户从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,如果文本参数为空字符串,它将跳过它并转到星形限定符,但问题是,许可证限定符需要前缀“license:”,因此,例如:

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

fetch(`${root}${txt}+stars:>=${starMin || 0}+license:${license}`)
处理此可选参数的首选方法是什么?我可以想出几种有条件地设置新变量的方法,但这是一种主要的代码味道

还有一个问题:现在,如果txt字符串为空,并且进行的查询应该是最小星号,那么生成的url将类似于:

https://api.github.com/search/repositories?q=+stars:>=5
它是有效的,但根据文档,搜索星星的方法是这样的,不带the+after=:


这被认为是坏习惯吗

您可以将它们放入一个数组中,然后通过
+
进行连接。如果没有值,则不要将其放入数组中。这样,对于不存在的值,就不会得到额外的
+

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

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

这与您的问题无关,但您需要
返回拒绝承诺的
,或者使用
抛出“网络故障”
。谢谢!接得好,谢谢!这绝对有效。我会把这个标记为正确答案,但我只是想看看是否还有其他建议,但我相信这是最好的方法。
const segments = []
if (txt) segments.push(`${txt}`)
if (license) segments.push(`license:${license}`)
segments.push(`stars:>=${starMin || 0}`)

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