从.graphql文件导入生成架构



我想创建一个GraphQL API,使用以下模式

app.use(
"/graphql",
graphQlHttp({
schema: buildSchema(`
type Event {
_id: ID!
title: String!
description: String!
price: Float!
}
input EventInput {
title: String!
description: String!
price: Float!
}
type QueryResolver {
getEvents: [Event!]!
}
type MutationResolver {
createEvent(eventInput: EventInput): [Event!]!
}
schema {
query: QueryResolver
mutation: MutationResolver
}
`),
rootValue: {}
})
);

目前,我在主文件中使用它作为字符串。我想把它放在一个graphql文件中。一种方法是我们可以读取文件,但我认为这不会有效率。

你能告诉我该怎么做吗

您可以添加此节点模块:https://github.com/ardatan/graphql-import-node

然后将您的模式移动到类似mySchema.graphql的模式。

然后,在JS:中

const mySchema = require('./mySchema.graphql');

或TypeScript:

import * as mySchema from './mySchema.graphql';

我没有资格发表评论,所以我将把它放在这里。

如果关注@Tim O'Connell答案的人想知道如何将导入的Schema传递给BuildSchema(),因为它不再是字符串,而是DocumentNode,那么实际上需要使用函数BuildASTSchema()

注意,BuildSchema()只是BuildASTSchema()的包装器,它将给定的字符串解析为DocumentNode。(来源(

因此,概括一下,做这样的事情:

import 'graphql-import-node';
import { buildASTSchema } from 'graphql';
import * as mySchema from './schema.graphql';
export = buildASTSchema(mySchema);

只需使用gql模块导入所有模式。安装方式:

npm i graphql-tag

您可以使用graphql工具。

const { loadSchemaSync } = require("@graphql-tools/load");
const { GraphQLFileLoader } = require("@graphql-tools/graphql-file-loader");
const { addResolversToSchema } = require("@graphql-tools/schema");
const { join } = require("path");
const schemaWithResolvers = addResolversToSchema({
schema: loadSchemaSync(join(__dirname, "./(your graphql file).graphql"), {
loaders: [new GraphQLFileLoader()],
}),
resolvers: {},
});

而且,你的graphql文件是

type Event {
_id: ID!
title: String!
description: String!
price: Float!
}
input EventInput {
title: String!
description: String!
price: Float!
}
type QueryResolver {
getEvents: [Event!]!
}
type MutationResolver {
createEvent(eventInput: EventInput): [Event!]!
}
schema {
query: QueryResolver
mutation: MutationResolver
}

然后,您只需要使用schemaWithResolvers.builldSchema是不必要的。

app.use(
"/graphql",
graphQlHttp({
schema: schemaWithResolvers 
})
);

最新更新