Как добавить несколько резольверов в тип (Apollo-сервер) - PullRequest
1 голос
/ 10 марта 2019

Я использовал express-graphql и там я делал что-то подобное.

const SubCategoryType = new ObjectType({
  name: 'SubCategory',
  fields: () => ({
    id: { type: IDType },
    name: { type: StringType },
    category: {
      type: CategoryType,
      resolve: parentValue => getCategoryBySubCategory(parentValue.id)
    },
    products: {
      type: List(ProductType),
      resolve: parentValue => getProductsBySubCategory(parentValue.id)
    }
  })
});

Здесь у меня есть несколько распознавателей, id and name извлекаются непосредственно из результата. и категория и продукты имеют свою собственную работу базы данных. и так далее. Сейчас я работаю над apollo-server и не могу найти способ повторить это.

например у меня есть тип

   type Test {
    something: String
    yo: String
    comment: Comment
  }
   type Comment {
    text: String
    createdAt: String
    author: User
  }

и в моем преобразователе я хочу разделить его, например, что-то вроде этого

text: {
    something: 'value',
    yo: 'value',
    comment: getComments();
}

ПРИМЕЧАНИЕ: это просто представление о том, что мне нужно.

1 Ответ

2 голосов
/ 11 марта 2019

Вы можете добавить специфичные для типа распознаватели для обработки определенных полей.Допустим, у вас есть следующая схема (на основе вашего примера):

type Query {
  getTest: Test
}
type Test {
  id: Int!
  something: String
  yo: String
  comment: Comment
}
type Comment {
  id: Int!
  text: String
  createdAt: String
  author: User
}
type User {
  id: Int!
  name: String
  email: String
}

Предположим также, что у вас есть следующие методы БД:

  • getTest() возвращает объект с полямиsomething, yo и commentId
  • getComment(id) возвращает объект с полями id, text, createdAt и userId
  • getUser(id) возвращаетобъект с полями id, name и email

Ваш распознаватель будет выглядеть примерно так:

const resolver = {
  // root Query resolver
  Query: {
    getTest: (root, args, ctx, info) => getTest()
  },
  // Test resolver
  Test: {
    // resolves field 'comment' on Test
    // the 'parent' arg contains the result from the parent resolver (here, getTest on root)
    comment: (parent, args, ctx, info) => getComment(parent.commentId)
  },
  // Comment resolver
  Comment: {
    // resolves field 'author' on Comment
    // the 'parent' arg contains the result from the parent resolver (here, comment on Test)
    author: (parent, args, ctx, info) => getUser(parent.userId)
  },
}

Надеюсь, это поможет.

...