【问题标题】:Can't get Graphql-tools to read my schema.graphql file无法让 Graphql-tools 读取我的 schema.graphql 文件
【发布时间】:2020-11-16 21:49:42
【问题描述】:

我正在使用 Apollo-server-express 和 Graphql-tools。我一直在阅读 Graphql-tools 文档,但我无法让它工作。我正在尝试将我的 schema.graphql 文件导入为我的 typeDefs。似乎 Graphql-tools 应该让这一切变得简单,但有些事情并没有落实到位。

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!
}

在当前状态下,我收到一条错误消息:“错误:typeDefs 必须是字符串、数组或模式 AST,得到对象”

据我了解,makeExecutableSchema 应该执行所有必要的步骤,例如将架构更改为字符串。我似乎无法弄清楚这里发生了什么,任何帮助将不胜感激。

【问题讨论】:

  • 如果您使用 babel 转译您的代码,我认为您可以通过插件 babel-plugin-import-graphql 的支持直接导入您的架构文件,例如:import yourSchema from "./path/to/yourSchema.graphql";

标签: javascript graphql apollo-server graphql-tools


【解决方案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 })

【讨论】:

  • 澄清一下:你是说使用 loadTypedefsSync 然后将 schemaSource 传递给新的 ApolloServer?我也尝试过,但没有成功。我尝试了 loadSchema 和 loadSchemaSync。我尝试了 addResolversToSchema 并将其传递给服务器。没有运气。我不断收到 typeDefs must be a string error.
  • 如果你使用 loadSchema 和 addResolversToSchema,你应该像这样传递模式:new ApolloServer({ schema: schemaWithResolvers })。请参阅编辑以获取更多详细信息。
  • 我一定有错字或我没有看到的东西。我注释掉了我所有的代码并复制并粘贴了你的代码,它可以工作。但是对于我的生活,我看不到代码中的差异......哈哈一定是什么。非常感谢您的帮助!
  • 变量名称无关紧要,但在这种情况下,您传入的是对象文字,而不是变量,并使用shorthand notation
  • 嗯,当然。感谢您指出这一点。
猜你喜欢
  • 2019-06-28
  • 2021-10-11
  • 1970-01-01
  • 2019-11-23
  • 2020-11-17
  • 2020-11-05
  • 1970-01-01
  • 2013-04-21
  • 2018-01-11
相关资源
最近更新 更多