Запрос Apollo возвращает ошибку «Ожидаемая строка, найденная строка» - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь получить один продукт из БД, но все время получаю сообщение об ошибке: «Ожидаемая строка, найденная строка» из GraphQL.

Вот код:

class ProductDetail extends React.Component {
  constructor(props) {
    super(props);
  }

  render() {
    console.log(JSON.stringify(this.props.id));
    return <Query query={GET_PRODUCT} variables={{_id: JSON.stringify(this.props.id)}}>
    {({ loading, error, data }) => {
      if (loading) return <ReactLoading type="spin" className="spinner" color={"black"}></ReactLoading>
      if (error) return <Alert color="danger">{error.message}</Alert>
      return (
        <div>
          {data.products.map(p => (
            console.log(data)
          ))}
        </div>
      )
    }}
  </Query>
  }
}


const GET_PRODUCT = gql`
    {
  product(_id: String) {
    brand
  }
}
`

export default ProductDetail;

Я заметил, что $ sign в определении запроса, пробовал с этим, но он возвращает: "Ожидаемая строка, найдено $".

1 Ответ

0 голосов
/ 09 мая 2018

Похоже, вы объединяете подпись операции и подпись поля. Самая первая строка запроса GraphQL имеет следующий формат:

[ operationType ] [ operationName ] [( variableDefinitions )]

Если тип операции опущен, предполагается, что он равен query (в отличие от mutation или subscription). Имя операции также необязательно. Рекомендуется всегда включать и при написании запросов.

Если у есть переменные, их определения следуют за именем операции и принимают следующий формат:

имя : тип [= defaultValue ]

Имена переменных всегда начинаются с $. После объявления они могут использоваться вместо любого аргумента внутри вашего запроса. Как и определения переменных, аргументы поля также заключены в круглые скобки, но их формат просто:

имя_ аргумента : значение

Итак, запрос может выглядеть так:

query SomeArbitraryName ($foo: String, $bar: Int!) {
  getSomething (name: $foo) {
    name
    quxs (max: $bar)
  }
}

Здесь мы определили две переменные ($foo и $bar). $foo используется для аргумента name для запроса getSomething, а $bar используется в качестве аргумента max для поля quxs. Обратите внимание, что типы, которые вы определяете для каждой переменной, имеют большое значение - я могу использовать только $foo в качестве замены для аргументов типа String (в отличие от другого скаляра или типа или String! или [String])

Обычно вы получаете одну переменную для каждого аргумента, поэтому принято просто использовать имя аргумента для имени переменной и просто добавить $, но имя переменной может быть любым, что вы захотите.

Собрав все вместе, ваш запрос должен выглядеть примерно так:

query WhateverNameYouLike ($_id: String) {
  product(_id: $_id) {
    brand
  }
}

Вы можете изменить имя переменной на что-то другое, например $productId, но вам также необходимо изменить способ ссылки на него внутри Query компонента

...