В graphql-js вы можете установить тип объекта , который поддерживается объектом класса JavaScript.Если вы это сделаете, вам не нужно предоставлять отдельные средства распознавания для методов класса;поле GraphQL, соответствующее методу класса, просто вызовет этот метод и будет использовать результаты.
Используемая вами серверная библиотека GraphQL будет нести ответственность за распаковку ответа со списком объектов наТип списка GraphQL и диспетчерские вызовы распознавателя для определенного объекта из этого списка по мере необходимости.
На любом языке реализации хорошим общим шаблоном для GraphQL является следующий:
распознаватели корневого уровня (типы Query
и Mutation
) находят определенные объекты;и
распознаватели уровня объекта (в вашем примере UserType
и MovieType
) действуют на известные конкретные объекты, которые уже имеют представление уровня языка программирования.
То есть, если вы находитесь в функции распознавателя для определенного типа, вам не нужно снова искать этот объект;у вас уже должно быть это (в вашем случае из корневых обработчиков запросов).
Ваши реализации распознавателя проясняют, что у ваших объектов уже есть поля, которые соответствуют именам полей GraphQL, поэтому необходимо внести два изменения:Заставить распознаватель корневого уровня предоставить конкретный объект:
const root = {
users: async () => User.find({}),
movies: async () => Movie.find({})
}
и просто предоставить схему, которая напрямую отражает существующий макет объекта:
const schema = buildSchema(`
type UserType {
name: String
imdbId: String
}
type MovieType {
title: String
year: Int
rating: Float
# rank: Int
director: StarType
stars: [StarType]
}
type Query {
users: [UserType]
movies: [MovieType]
}
`)
Для кода, который выпоказано, что ничего не требует специального распознавателя, за исключением того, что вы пытаетесь переименовать поле rating
в rate
.В graphql-js я считаю, что вам нужно предоставить фактический объект, который имеет действительные имена полей, которые вы хотите, и я обнаружил, что часто имеет смысл иметь отдельный набор объектов, которые непосредственно отражают API GraphQL, который вы хотите.
По моему опыту, если возможно использовать язык схемы GraphQL, вы должны сделать это: он гораздо более компактен и удобочитаем, чем объектное представление тех же типов.