Добавление заголовков в apollo watchQuery дает неопределенные данные - PullRequest
0 голосов
/ 04 января 2019

Я использую apollo-angular пакет для запроса бэкэнда с использованием graphQL. Все работает нормально, пока я не добавлю заголовки к запросу.

Я добавляю пользовательский заголовок, чтобы получить сведенные данные из бэкэнда.

Когда я добавляю заголовок к запросу, я получаю данные как неопределенные. Хотя на вкладке сети я вижу, что ответ поступает правильно (сглаженные данные).

Вот мой код:

constructor(private apollo: Apollo) { }

getPos(id: string, date: string) : Observable<any> {
    return this.apollo
            .watchQuery({
                query: gql`
                {
                  pos(id: 10001, date: "2017-02-01") {
                    id
                    quantity
                    price
                    security {
                       id
                       ....
                    }
                    ....
                  }
                }`,
                context: { 
                   headers: new HttpHeaders().set("isFlatten", "true") // adding header
                }
            })
            .valueChanges
            .pipe(
              tap(resp => console.log(resp.data)),
              map(result => result.data['pos'])
            );
}

Данные ответа (сплющенные)

{
  "data": [
    {
      "data.pos.security.__typename": "Security",
      "data.pos.quantity": 14,
      "data.pos.id": 3,
      "data.pos.price": 740.6634841227037,
      "data.pos.security.id": 296
       .............
    },
    {
      "data.pos.security.__typename": "Security",
      "data.pos.quantity": 34,
      "data.pos.id": 13,
      "data.pos.price": 755,
      "data.pos.security.id": 290
       ...........
    }]
}

Примечание : Также, если я удаляю атрибут контекста, он правильно печатает ответ (не сплющенные данные)

1 Ответ

0 голосов
/ 04 января 2019

По спецификации:

Запись данных в ответе будет результатом выполнения запрошенной операции. Если операция была запросом, этот вывод будет объектом корневого типа запроса схемы; если операция была мутацией, этот вывод будет объектом корневого типа мутации схемы.

Ожидается, что данные будут объектом, ключи которого соответствуют запрашиваемым корневым полям в вашем документе (pos в данном случае). Apollo ожидает значения в data.pos, но, поскольку data является массивом и не имеет этого свойства, он возвращает неопределенное значение.

Подобное форматирование ответа сервера GraphQL нарушает спецификацию и делает ваш API несовместимым с apollo-client. Даже если data был объектом со свойством pos, форматирование ответа таким образом, вероятно, также нарушит кеширование.

...