Как избежать возврата null в Apollo Federation GraphQL
У меня есть две службы (реализованные с использованием DGS Netflix), которые я хочу объединить с помощью федерации apollo. Первый - это пользовательский сервис, модель которого выглядит примерно так:
type User @key(fields: "sku") {
id: ID!
sku: Long
score: Float
}
и у каждого может быть продукт, полученный из другой службы:
type User @key(fields: "sku") @extends {
sku: Long! @external
product: Product!
}
И я хочу, чтобы все пользователи имели свои продукты, но может случиться так, что у пользователя нет продукта.
Есть ли способ избежать возврата пользователя, если его продукт нулевой?
users: [User]
В настоящее время мой ответ выглядит так:
"errors": [
{
"message": "The field at path '/_entities[0]/product' was declared as a non null type, but the code involved in retrieving data has wrongly returned a null value. The graphql specification requires that the parent field be set to null, or if that is non nullable that it bubble up null to its parent and so on. The non-nullable type is 'Product' within parent type 'User'",
} ...
"data": {
"users": [
null,
null,
{
"sku": 9002490100490,
"score": 0.72,
"product": {
"title": "Sabritas limón 160 g",
"name": "Sabritas limón"
}
},
null,
null,
null,
{
"sku": 99176480310,
"score": 0.99,
"product": {
"title": "Cerveza Boca Negra pilsner 355 ml",
"name": "Cerveza Boca Negra pilsner"
}
},
null,
{
"sku": 8712000030605,
"score": 0.21,
"product": {
"title": "Cerveza Victoria lata 355 ml x12",
"name": "Cerveza Victoria lata"
}
}
]
}
Я хотел бы иметь такой же список, но без нулей в списке и без ошибки. Является ли это возможным? Я думал добавить какую-то настраиваемую директиву, которая удаляет нулевые элементы, но не удалось.
1 ответ
Я также немного исследовал директивы как потенциальное решение и пришел к выводу, что GraphQL не способен на такое, поэтому вам нужно сделать это где-нибудь в коде, например, вы можете отфильтровать ответ в своем преобразователе с помощью фильтра:
return users.filter(Boolean)