Добавление заголовков в apollo watchQuery дает неопределенные данные

Я использую пакет 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
       ...........
    }]
}

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


person Amit Chigadani    schedule 04.01.2019    source источник
comment
Как выравниваются данные? Соответствует ли возвращенный JSON спецификации?   -  person Daniel Rearden    schedule 04.01.2019
comment
Да, с заголовком и без него он показывает правильный ответ JSON на вкладке сетей. Единственное, когда я добавляю заголовок, он печатает undefined.   -  person Amit Chigadani    schedule 04.01.2019
comment
Как вы упомянули, я думаю, это как-то связано с плоскими данными. Когда я устанавливаю isFlatten как false, он печатает несведенные данные. Так что проблем с заголовком здесь нет.   -  person Amit Chigadani    schedule 04.01.2019
comment
Можете ли вы опубликовать запрос и ответ от сервера?   -  person Daniel Rearden    schedule 04.01.2019
comment
@DanielRearden Я добавил ответ. Пожалуйста, посмотрите   -  person Amit Chigadani    schedule 04.01.2019
comment
Неясно, чего вы пытаетесь достичь, выполняя такое форматирование ответа, но, вероятно, есть лучший способ сделать это, который не сломает клиент. Вы могли бы уточнить свое намерение, хотя это может выходить за рамки этого вопроса и, вероятно, должно быть отдельным.   -  person Daniel Rearden    schedule 04.01.2019


Ответы (1)


Согласно спецификации:

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

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

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

person Daniel Rearden    schedule 04.01.2019
comment
То есть вы хотите сказать, что если я верну ответ типа {data: {pos: [{...}, {...}]}}, это сработает? - person Amit Chigadani; 04.01.2019
comment
Да, это должно помочь, но вполне вероятно, что клиент по-прежнему будет вести себя неожиданно, особенно в отношении кэширования. - person Daniel Rearden; 04.01.2019
comment
Спасибо за ваш ответ. У меня нет доступа к бэкенду, чтобы изменить его. Я постараюсь вернуться к вам. - person Amit Chigadani; 04.01.2019