在graphql中合并不同的模式

问题描述

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,然后导入上面的main index.js。这是我第一次学习graphql。任何帮助将不胜感激

解决方法

您可以使用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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...