Javascript 处理可选API查询字符串参数
我在React中使用Github API,并且有一个表单,允许用户从3个不同类别搜索存储库:文本(就像在名称中包含该文本的任何存储库中一样)、星星(就像最小星星数一样)和许可证类型 可以使用这三个类别的任意组合进行搜索 因此,我有以下api fetch函数: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) =>
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('+')}`)