在graphql中合并不同的模式
Posted
技术标签:
【中文标题】在graphql中合并不同的模式【英文标题】:merge different schema in graphql 【发布时间】:2021-02-05 19:26:17 【问题描述】:schema.js
const buildSchema = require('graphql');
module.exports = buildSchema(`
type Booking
_id: ID!
event: Event!
user: User!
type Event
_id: ID!
title: String!
description: String!
price: Float!
creator: User
type User
_id: ID!
email: String!
password: String
createdEvents: [Event!]
type RootQuery
events: [Event!]!
users: [User!]!
bookings: [Booking!]!
schema
query: RootQuery
`);
index.js
app.use(
'/graphql',
graphqlHTTP(
schema: graphQlSchema,
rootValue: graphQlResolvers,
graphiql: true
)
);
我只是想学习 graphql,这是我的第一次,所以我有点困惑上面的查询工作正常,但我想要 3 个不同的文件用于预订、用户、事件并将它们合并到一个文件名索引中。 js,然后在主 index.js 中导入,它高于一个。这是我第一次学习graphql。任何帮助将不胜感激
【问题讨论】:
【参考方案1】:您可以使用graphql-tools
包中的Type definitions (SDL) merging 来合并您的类型定义文件。
此工具合并了 GraphQL 类型定义和架构。它旨在合并所有可能的类型、接口、枚举和联合,而不会发生冲突。
例如
types/booking.js
:
module.exports = `
type Booking
_id: ID!
event: Event!
user: User!
`;
types/user.js
:
module.exports = `
type User
_id: ID!
email: String!
password: String
createdEvents: [Event!]
`;
types/event.js
:
module.exports = `
type Event
_id: ID!
title: String!
description: String!
price: Float!
creator: User
`;
types/index.js
:
const mergeTypeDefs = require('@graphql-tools/merge');
const bookingType = require('./booking');
const userType = require('./user');
const eventType = require('./event');
const rootTypes = `
type RootQuery
events: [Event!]!
users: [User!]!
bookings: [Booking!]!
schema
query: RootQuery
`;
const types = [bookingType, userType, eventType, rootTypes];
module.exports = mergeTypeDefs(types);
server.js
:
const express = require('express');
const graphqlHTTP = require('express-graphql');
const buildSchema, print = require('graphql');
const typeDefs = require('./types');
const app = express();
const port = 4000;
const schema = buildSchema(print(typeDefs));
console.log(print(typeDefs));
app.use(
'/graphql',
graphqlHTTP(
schema,
graphiql: true,
),
);
app.listen(port, () => console.log('Server started at port:', port));
服务器日志:
type Booking
_id: ID!
event: Event!
user: User!
type User
_id: ID!
email: String!
password: String
createdEvents: [Event!]
type Event
_id: ID!
title: String!
description: String!
price: Float!
creator: User
type RootQuery
events: [Event!]!
users: [User!]!
bookings: [Booking!]!
schema
query: RootQuery
Server started at port: 4000
【讨论】:
以上是关于在graphql中合并不同的模式的主要内容,如果未能解决你的问题,请参考以下文章
我们如何从 apollo-server 模块传递 ApolloServer 中的数据源和合并的 graphql 模式和解析器?
我是 graphql 的新手,我发现在 django-graphql 中使用来自两个不同应用程序的模式有困难?
将 GraphQL 模式拆分为 express-graphql 中不同模块的最佳方法?