在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中合并不同的模式的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 拼接 VS 合并模式

我们如何从 apollo-server 模块传递 ApolloServer 中的数据源和合并的 graphql 模式和解析器?

我是 graphql 的新手,我发现在 django-graphql 中使用来自两个不同应用程序的模式有困难?

将 GraphQL 模式拆分为 express-graphql 中不同模块的最佳方法?

在 vue.js 客户端合并来自不同 graphql 解析器的数据以进行简单输出

typescript 中不同 GraphQL 语法的优缺点