模板文字 - 从 API 获取错误

IT技术 reactjs graphql
2021-03-27 07:26:28

所以我有一个按名称搜索动漫的方法,API 是 graphQL。这是查询的重要部分

const searchQuery = this.state.searchString;

var query = `query Search{
  # the rest of the query omitted for brevity
    media(type:ANIME, search: ${searchQuery} ){
  # ... 
}
`

我收到两种类型的错误响应,第一种是当搜索字符串由多个由空格分隔的单词组成时 - “语法错误:预期:,找到)”

其次,当我搜索单个单词时 - “字段“媒体”参数“搜索”需要类型字符串,找到火影忍者。”

这里有什么问题?

您可以在此处查看完整代码 - https://github.com/red4211/react-anime-search,应用程序部署到 github 页面,搜索 API 响应转到控制台 - https://red4211.github.io/react-anime-搜索/

2个回答

问题是,给定一些诸如“火影忍者”之类的查询,您当前的代码会生成以下文本:

media(type:ANIME, search: naruto ) {

这不是有效的语法,因为字符串文字应该用双引号 ( ")括起来

不要使用字符串插值向查询提供动态值。这些应始终表示为变量,并作为单独的对象包含在您的请求中query

您需要将变量定义为操作的一部分,提供适当的类型

var query = `query Search ($searchQuery: String!) {

然后您可以在操作中的任何位置使用该变量:

media(type:ANIME, search: $searchQuery) {

现在只需将变量值与您的请求一起传递。

body: JSON.stringify({
  query,
  variables: {
    searchQuery,
  }
})

请注意,变量名称$在 GraphQL 文档内部以 a 为前缀,但在其外部,我们不这样做。

media() 看起来像一个函数,所以在这种情况下,正确的语法是:

media(type="ANIME", search=searchQuery)

或者如果 media() 的参数是一个对象

media({type: "ANIME", search: searchQuery})

此外,您不需要在 searchQuery 周围使用 ${},因为 searchQuery 已经是一个字符串。其用法类似于

`${searchString}` or `foo${searchString}bar`

在 ${} 实用程序周围使用 `` 来表示字符串及其在字符串文字中的变量。

希望能帮助到你!

这在原始问题中并不清楚,但media指的是正在发送的查询中的一个字段,它本身就是一个模板字符串。我已经编辑了问题以更好地反映 OP 的实际代码。根据实际情况,这个答案并没有真正意义。
2021-06-11 07:26:28