我使用的是Apollo-server-express和Graphql工具。我已经看遍了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必须是一个字符串、数组或schema AST,got对象“
据我所知,makeExecutableSchema应该执行所有必要的步骤,比如将模式更改为字符串。我似乎不知道这里发生了什么,任何帮助都将不胜感激。
发布于 2020-07-27 23:26:46
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 })https://stackoverflow.com/questions/63117446
复制相似问题