首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法获取图形查询语言工具来读取我的schema.graphql文件

无法获取图形查询语言工具来读取我的schema.graphql文件
EN

Stack Overflow用户
提问于 2020-07-27 22:26:29
回答 1查看 1.8K关注 0票数 3

我使用的是Apollo-server-express和Graphql工具。我已经看遍了Graphql-tools文档,但我不能让它工作。我正在尝试将我的schema.graphql文件作为我的typeDefs导入。看起来Graphql工具应该让这件事变得简单,但有些东西并没有落到合适的位置。

index.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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必须是一个字符串、数组或schema AST,got对象“

据我所知,makeExecutableSchema应该执行所有必要的步骤,比如将模式更改为字符串。我似乎不知道这里发生了什么,任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-27 23:26:46

loadSchemaSync将使用提供的指针加载GraphQLSchema对象。您应该改用loadTypedefsSync

代码语言:javascript
复制
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中所示的方式执行此操作

代码语言:javascript
复制
const schema = loadSchemaSync(join(__dirname, "schema.graphql"), {
  loaders: [new GraphQLFileLoader()],
});

const resolvers = {...};
const schemaWithResolvers = addResolversToSchema({
    schema,
    resolvers,
});
const server = new ApolloServer({ schema: schemaWithResolvers })
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63117446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档