Не могу заставить Graphql-tools прочитать мой файл schema.graphql

Я использую Apollo-server-express и Graphql-tools. Я просмотрел всю документацию по Graphql-tools, и я не могу заставить это работать. Я пытаюсь импортировать свой файл schema.graphql как мой typeDefs. Кажется, что инструменты Graphql должны упростить это, но что-то не встает на свои места.

index.js

const { ApolloServer } = require("apollo-server-express");
const { makeExecutableSchema } = require('@graphql-tools/schema');
const express = require("express");
const { join } = require("path");
const { loadSchema } = require("@graphql-tools/load");
const { GraphQLFileLoader } = require("@graphql-tools/graphql-file-loader");
const { addResolversToSchema } = require("@graphql-tools/schema");
const app = express();

const resolvers = {
  Query: {
    items: (parent, args, ctx, info) => {
      return ctx.prisma.item.findMany();
    },
  },
  Mutation: {
    makeItem: (parent, args, context, info) => {
      const newItem = context.prisma.item.create({
        data: {
          ...args,
          price: parseInt(Math.ceil(args.price * 100)),
        },
      });
      return newItem;
    },
    deleteItem: (parent, args, context, info) => {
      return context.prisma.item.delete({
        where: {
          id: args.id,
        },
      });
    },
  },
};

const schemaSource = loadSchemaSync(join(__dirname, "schema.graphql"), {
  loaders: [new GraphQLFileLoader()],
});

const schema = makeExecutableSchema({
  typeDefs: schemaSource,
  resolvers,
});

const server = new ApolloServer({
  schema,
  resolvers,
});

server.applyMiddleware({ app });

app.listen(
  { port: 4000 },
  () =>
    console.log(
      `???? => Backend server is now running on port http://localhost:4000`
    )
);

schema.graphql

type Query {
  items: [Item!]!
}

type Mutation {
  makeItem(
    piece: String!
    image: String!
    identifier: String!
    price: Float!
    itemNumber: Int!
  ): Item!
  deleteItem(id: ID!): Item!
}

type Item {
  id: ID!
  piece: String!
  image: String!
  identifier: String!
  price: Int!
  itemNumber: Int!
}

В текущем состоянии я получаю сообщение об ошибке: Error: typeDefs должен быть строкой, массивом или схемой AST, получил объект

Насколько я понимаю, makeExecutableSchema должна выполнять все необходимые шаги, например преобразовывать схему в строку. Кажется, я не могу понять, что здесь происходит, и любая помощь будет принята с благодарностью.


person BWayne    schedule 27.07.2020    source источник
comment
Если вы используете babel для переноса кода, я думаю, вы можете напрямую импортировать свой файл схемы, например: import yourSchema from "./path/to/yourSchema.graphql"; при поддержке плагина babel-plugin-import-graphql   -  person tmhao2005    schedule 27.07.2020


Ответы (1)


loadSchemaSync загрузит GraphQLSchema объект, используя предоставленный указатель. Вместо этого вы должны использовать loadTypedefsSync.

const sources = loadTypedefsSync(join(__dirname, "schema.graphql"), {
  loaders: [new GraphQLFileLoader()],
});
const typeDefs = sources.map(source => source.document)
const server = new ApolloServer({ typeDefs, resolvers })

Если вы хотите использовать loadSchema, вам не нужно использовать makeExecutableSchema, потому что ваша схема уже создана. Вместо этого вы должны сделать это, как показано в docs < / а>:

const schema = loadSchemaSync(join(__dirname, "schema.graphql"), {
  loaders: [new GraphQLFileLoader()],
});

const resolvers = {...};
const schemaWithResolvers = addResolversToSchema({
    schema,
    resolvers,
});
const server = new ApolloServer({ schema: schemaWithResolvers })
person Daniel Rearden    schedule 27.07.2020
comment
Для ясности: вы говорите, что используйте loadTypedefsSync, а затем передайте schemaSource новому ApolloServer? Я пробовал и это, но безуспешно. Я пробовал loadSchema и loadSchemaSync. Я попробовал addResolversToSchema и передал его на сервер. Не повезло. Я продолжаю получать typeDefs, должно быть, ошибка строки. - person BWayne; 27.07.2020
comment
Если вы используете loadSchema и addResolversToSchema, вы должны передать схему следующим образом: new ApolloServer({ schema: schemaWithResolvers }). Дополнительные сведения см. В редактировании. - person Daniel Rearden; 27.07.2020
comment
У меня должна быть опечатка или что-то, чего я не вижу. Я закомментировал весь свой код, скопировал и вставил ваш, и он работает. Но хоть убей, я не вижу разницы в коде ... хотя, должно быть, что-то есть. Огромное спасибо за помощь! - person BWayne; 27.07.2020
comment
Здесь стоит отметить, что addResolversToSchema () требует от вас передачи схемы. Я проходил мимо источников. Насколько я понимаю, имена переменных не имеют значения, но, похоже, это не так. Вот откуда взялась часть моей проблемы. - person BWayne; 27.07.2020
comment
Ааааааааааааааааааааааааааааааааааааааа, конечно. Спасибо что подметил это. - person BWayne; 27.07.2020