Объединение наборов данных Rest в Федерации с резолверами?
Довольно новичок в GraphQL и Федерации Аполлона.
У меня вопрос, можно ли заполнить один набор данных другим, например:
# in Shop Service
type carId {
id: Int
}
type Shop @key(fields: "id") {
id: ID!
name: String
carIds: [CarId]
}
# in Car Service
type Car {
id: ID!
name: String
}
extends type Shop @key(fields: "id") {
id: ID! @external
cars: [Car]
}
Авто Резольвер
Query{...},
Shop: {
async cars(shop, _, { dataSources }) {
console.log(shop); // Issue here is it returns the references that are an object only holding the `id` key of the shop, I need the `cars` key here, to pass to my CarsAPI
return await dataSources.CarsAPI.getCarsByIds(shop.carsIds);
}
}
В API Shop rest ответ будет выглядеть так:
[{id: 1, name: "Brians Shop", cars: [1, 2, 3]}, {id: 2, name: "Ada's shop", cars: [4,5,6]}]
Из API автостоянки ответ будет выглядеть так:
[{id: 1, name: "Mustang"}, {id: 2, name: "Viper"}, {id: 3, name: "Boaty"}]
Итак, что я хочу заархивировать, так это запросить мой сервер GraphQL для:
Shop(id: 1) {
id
name
cars {
name
}
}
А потом ожидайте:
{
id: 1,
name: "Brian's shop",
cars: [
{name: "Mustang"},
{name: "Viper"},
{name: "Boaty"}
]
}
Возможно ли такое, я так думал, когда выбирал федерацию:)
1 ответ
Итак, если я правильно понял после ваших комментариев, вы хотите, чтобы carIds
из сервиса "Магазин", входящего в ваш "Авто сервис" внутри cars
резольвер.
Вы можете использовать @requires
директива, которая проинструктирует Apollo Server, что вам нужно поле (или несколько), прежде чем он начнет выполнение cars
резольвер. То есть:
Автосервис
extend type Shop @key(fields: "id") {
id: ID! @external
carIds: [Int] @external
cars: [Car] @requires(fields: "carIds")
}
Теперь внутри cars
решатель, у вас должен быть доступ к shop.carIds
по вашему первому параметру.
См. https://www.apollographql.com/docs/apollo-server/federation/advanced-features/.