Добавление заголовков в 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
...........
}]
}
Примечание. Также, если я удаляю атрибут контекста, он правильно печатает ответ (не сплющенные данные)
1 ответ
Согласно спецификации:
Ввод данных в ответ будет результатом выполнения запрошенной операции. Если операция была запросом, этот вывод будет объектом корневого типа запроса схемы; если операция была мутацией, этот вывод будет объектом корневого типа мутации схемы.
Ожидается, что данные будут объектом, ключи которого соответствуют запрашиваемым корневым полям в вашем документе (pos
в этом случае). Аполлон рассчитывает на значение в data.pos
, но с тех пор data
является массивом и не имеет этого свойства, возвращает неопределенное.
Такое форматирование ответа сервера GraphQL на стороне сервера нарушает спецификации и делает ваш API несовместимым с apollo-client. Даже если data
был объект с pos
свойство, форматирование вашего ответа таким образом, вероятно, также нарушит кеширование.