#graphql #react-apollo #apollo-client #graphql-js
#graphql #react-apollo #apollo-клиент #graphql-js
Вопрос:
У меня есть typeDefs, который не возвращает вложенный объект
Я хотел бы запросить квартиру с помощью, у которой есть владелец и документ во вложенном запросе, но он возвращает null.
файл содержит ссылку на соответствующий файл данных.
const apartments = require('./data/apartment.json');
const person = require('./data/person.json');
const document = require('./data/document.json');
запрос apartment возвращается правильно, но вложенная информация (владелец и соответствующие документы) возвращает значение null
query {
apartments{
id
code
owner{
id
name
document{
name
type
}
}
}
const typeDefs = gql`
type Query {
apartments(
id:ID
code: String
description: String
createdAt: String
updatedAt: String
): [Apartment]
person:[Person]
}
type Apartment {
id: ID
code: String
description: String
owner:[Person]
createdAt: String
updatedAt: String
}
type Person {
id: ID
name: String
document: [Document]
createdAt: String
updatedAt: String
}
type Document {
id: ID
name: String
type: String
number: String
createdAt: String
updatedAt: String
}
`
это распознаватель
const resolvers = {
Query: {
apartments: () => {
return apartments;
},
person: () => {
return person;
},
document: () => {
return document;
}
}
}
кто-нибудь может помочь извлечь вложенные данные?
Комментарии:
1. Ваша схема GraphQL и запрос выглядят правильными для меня. Однако я не могу догадаться, как работает ваш распознаватель, куда вам нужно вложить объекты
2. сервер? образец данных о квартире? покажите преобразователи, насколько они связаны?
3. просто не связано … нет распознавателя полей владельца, указывающего на данные пользователя
Ответ №1:
Мне не хватало преобразователя, поэтому я обновил поле для пользователей и обновил преобразователь
people(parent) {
return people.filter(person => person.apartmentId === parent.apartmentId);
}
Это новая схема
// Schema definition
const typeDefs = gql`
# A Block has a blockName and Apartments
type Block {
blockName: String!
blockCode: String!
apartments: [Apartment!]
}
# A Apartment has a apartmentId and people
type Apartment {
apartmentId: String!
people: [Person!]
}
# People has a name
type Person {
personName: String!
}
# Queries can fetch a list of libraries
type Query {
blocks: [Block]
}
`;
теперь карта преобразователя выглядит следующим образом:
// Resolver map
const resolvers = {
Query: {
blocks() {
// Return our hardcoded array of blocks
return blocks;
}
},
Block: {
apartments(parent) {
// Filter the hardcoded array of blocks to only include the respective apartment in the blockName
return apartments.filter(apartment => apartment.blockName === parent.blockName);
}
},
Apartment: {
// filter all the people that live at the same apartment
people(parent) {
return people.filter(person => person.apartmentId === parent.apartmentId);
}
}
};
и вложенный запрос выглядит следующим образом
query GetPeopleByBlockAndApartment {
blocks {
blockCode
blockName
apartments {
apartmentId
people {
personName
}
}
}
}
Большое спасибо всем, кто пытался помочь.