我正在使用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
答案 0 :(得分:1)
您可以将它们放入数组并按+
加入。如果没有价值,请不要放入阵列。这样,您就不会为不存在的值获得额外的+
。
const segments = []
if (txt) segments.push(`${txt}`)
if (license) segments.push(`license:${license}`)
segments.push(`stars:>=${starMin || 0}`)
fetch(`${root}${segments.join('+')}`)