#optimization #graphql #express-graphql
#оптимизация #graphql #экспресс-graphql
Вопрос:
Я изучаю GraphQL и ищу некоторые рекомендации о том, на правильном ли я пути, или я просто полностью не в курсе. По сути, я написал свой бэкэнд с помощью express-graphql и Prisma, я видел несколько разных руководств, в которых, казалось, типы и распознаватели писались отдельно, используя большие строки шаблонов для определения схемы. Я следовал руководству Net Ninja по GraphQL, которое использовалось new GraphQlObjectType()
для построения схемы, и импортировал все различные типы в один корневой запрос, который затем передается в GraphQlSchema()
Мое замешательство и вопрос: правильно ли это делать?
В итоге я получил очень длинный файл схемы, который является функциональным и рабочим, но не идеальным для обслуживания. Я изо всех сил пытался найти в Интернете какие-либо примеры того, как разделить этот код и сохранить его работоспособность. Я пробовал экспортировать файл только из типов объектов GraphQL и импортировать их в schema.js
файл, а затем создавать там свой корневой запрос, но, похоже, это не работает. Я пробовал экспортировать только поля как объект, а затем использовать оператор распространения для сборки моего корневого запроса, и я пробовал несколько new GraphQlSchema()
операторов в своих файлах типов, а затем использовал graphql-tools mergeSchema
, чтобы собрать все это вместе, но это тоже не сработало. На данный момент я немного запутался, и мне просто нужно какое-то руководство или пример для рассмотрения более крупного проекта, построенного таким образом.
Для справки, вот пример фрагмента, чтобы было понятно, как я построил свой серверный сервер GQL, чтобы уточнить, что запросы работают просто отлично, здесь я с благодарностью ищу совета по обслуживанию кода 🙂
Спасибо за любую помощь или примеры!
const prisma = require("../config/prismaClient");
const graphql = require('graphql');
const {
GraphQLObjectType,
GraphQLSchema,
GraphQLString,
GraphQLList } = graphql;
const UserType = new GraphQLObjectType({
name: "User",
fields: () => ({
id: { type: GraphQLString },
first_name: { type: GraphQLString },
last_name: { type: GraphQLString },
})
})
const BusinessType = new GraphQLObjectType({
name: 'Business',
fields: () => ({
id: { type: GraphQLString },
name: { type: GraphQLString },
street_address: { type: GraphQLString },
})
})
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
users: {
type: new GraphQLList(UserType),
async resolve() {
return await prisma.users.findMany();
}
},
businesses: {
type: new GraphQLList(BusinessType),
async resolve() {
return await prisma.businesses.findMany();
}
}
}
})
module.exports = new GraphQLSchema({
query: RootQuery
})
Ответ №1:
Мое замешательство и вопрос: правильно ли это делать?
Не существует правильного или неправильного способа написания вашей схемы. Вы можете использовать SDL (язык определения схемы), который очень удобочитаем, но затем вам нужно добавить некоторые зависимости в свой проект, чтобы настроить это. В GraphQL Tools есть очень хорошие утилиты, которые упрощают написание вашей схемы.
Да, это может быть немного сложно при попытке настроить эти инструменты. Мне нравится разделять мою схему и преобразователи в каталоге на основе Type
, а затем graphql-tools
помогает мне объединить все преобразователи и схему в один. Я нашел этот проект https://github.com/lucassus/bookshelf взгляните на то, как они структурировали там сервер graphql https://github.com/lucassus/bookshelf/tree/master/apps/server/src/interfaces/graphql