Запрос с разными типами в GraphQL

У меня есть GraphQL userType и EventType, и на моем userType мне нужно сделать вложенный запрос с помощью EventType, но мне также нужно вернуть информацию о пользователе. Поскольку в EventType нет полей, таких же, как информация о пользователе, чтобы передать свой код при тестировании, мне пришлось вручную скопировать и вставить UserType в EventType, но я не хочу, чтобы это решало.

Есть ли способ полюбить типы слияния? Я использую MongoDB в качестве своей базы данных, поэтому при попытке сделать POPULATE информация о пользователе возвращается, но GraphQL усложняет задачу.

Вот что я сделал на EventType, чтобы пройти тест. Под "fixme" копирую UserType:

module.exports = {
  EventType: new GraphQLObjectType({
    name: 'Event',
    fields: () => ({
      id: {type: GraphQLID},
      organizerId: {type: new GraphQLList(GraphQLID)},
      title: {type: GraphQLString},
      image: {type: GraphQLString},
      description: {type: GraphQLString},
      location: {type: GraphQLString},
      items: {type: GraphQLInt},
      date: {type: GraphQLString},
      attendeesId: {type: new GraphQLList(GraphQLID)},
      supplies: {type: new GraphQLList(GraphQLString)},
      test: {type: GraphQLString},

      // FIXME: USER TYPES!
     firstName: {type: GraphQLString},
     lastName: {type: GraphQLString},
     email: {type: GraphQLString},
     age: {type: GraphQLInt},
     token: {type: GraphQLString},
     image: {type: GraphQLString},
     phone: {type: GraphQLInt},
     address: {type: GraphQLString},
     // ! TYPE RELATION
     userRelatedToEvent: {
     type: UserType,
     resolve: async (parent, args) => {
       const id = {
         id: parent.organizerId
       };
       return await getCurrentUser(id);
      }
    }
  })
 })
};

это мой код на UserType, который выполняет отношение типа на EventType, см. опору resolve

module.exports = {
 UserType: new GraphQLObjectType({
 name: 'User',
 fields: () => ({
  id: {type: GraphQLID},
  firstName: {type: GraphQLString},
  lastName: {type: GraphQLString},
  email: {type: GraphQLString},
  age: {type: GraphQLInt},
  token: {type: GraphQLString},
  image: {type: GraphQLString},
  phone: {type: GraphQLInt},
  address: {type: GraphQLString},
  eventsId: {type: new GraphQLList(GraphQLID)}, // <-- this will be the query for userRelatedToUser
  statusCode: {type: GraphQLInt},
  isSuccess: {type: GraphQLBoolean},
  msg: {type: GraphQLString},
  test: {type: GraphQLString}, // testing query
  // errors: { type: GraphQ LString },
  eventRelatedToUser: {
    type: require('./eventTypeDef').EventType,
    resolve: async (parent, args) => {
      const event = {
        event: parent.eventsId
      };
      const test = await getEventWithEventId(event); // <-- queries event
      const id = {
        id: test.attendeesId
      };
      const users = await getCurrentUser(id); // <-- user info
      console.info(users);
      return {...users, ...test};
    }
   }
  })
 })
};

Есть ли у самого события имя, фамилия, и Т. Д., или эти поля являются копиями полей соответствующего пользователя?

David Maze 03.01.2019 19:36

это копии. вот что я пытаюсь выяснить. чтобы связать оба поля. есть такой способ? @DavidMaze

aRtoo 03.01.2019 20:35

Обычный способ GraphQL - не иметь этих полей напрямую; запрос, подобный someEvent { user { firstName } }, вернет его.

David Maze 03.01.2019 23:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
3
51
0

Другие вопросы по теме