GraphQL - Как предотвратить вычисление поля в ресурсе, который не указан в запросе? - PullRequest
0 голосов
/ 07 октября 2019

У меня есть такой ресурс, как:

{
  a: String
  b: String
  c: [JSON]
}

поля a и b являются свойством объекта БД, но поле c вычисляется, и это может занять некоторое время.

Проблема возникает всякий раз, когда яЯ делаю запрос, он всегда вычисляет это поле, даже если в запросе указаны только поля a и b для извлечения.

Существуют ли какие-либо "способы graphql", чтобы запретить вычисления без передачи дополнительного параметра, который скажет серверу "don"t вычисляет поле c "?

UPD: Мой распознаватель выглядит примерно так:

const x = retrieveFromDB(...)
// x = {a: 'x', b: 'y'}
x.c = computingField(...) // it takes a lot of time
return x

1 Ответ

1 голос
/ 08 октября 2019

Поля GraphQL никогда не разрешаются, если они явно не запрошены.

Давайте рассмотрим более сложный пример. Допустим, у нас есть эта схема:

type Query {
  getUser: User
}

type User {
  firstName: String
  lastName: String
  fullName: String
}

И наши распознаватели выглядят так:

const resolvers = {
  Query: {
    getUser: () => ({ firstName: 'Susan', lastName: 'Martinez' }),
  },
  User: {
    fullName: (user) => `${user.first_name,} ${user.last_name,}`,
  },
}

Мы возвращаем пользовательский объект в нашем getUser распознавателе. Мы полагаемся на поведение распознавателя по умолчанию для полей firstName и lastName, но предоставляем собственный распознаватель для fullName. Если мы сделаем этот запрос:

query {
  getUser {
    firstName
  }
}

, то будут вызваны только два резольвера - один для getUser и один для firstName. Однако этот запрос

query {
  getUser {
    firstName
    fullName
  }
}

также вызовет преобразователь fullName. Каждый распознаватель имеет доступ к любому значению, к которому разрешено родительское поле. Поэтому, если определение fullName стоит дорого, вы можете переместить логику для оценки этого значения в распознаватель поля.

С другой стороны, если вам просто нужно знать, какие дочерние поля были запрошены, на это уже есть ответ .

...