Как вернуть вложенные объекты на языке схем GraphQL

Я просматривал документацию по GraphQl и понял, что новый язык схемы поддерживает только преобразователи по умолчанию. Есть ли способ добавить настраиваемые преобразователи при использовании нового языка схемы?

let userObj = {
  id: 1,
  name: "A",
  homeAddress: {
    line1: "Line1",
    line2: "Line2",
    city: "City"
  }
};

let schema = buildSchema(`
  type Query {
    user(id: ID): User
  }

  type User {
    id: ID
    name: String
    address: String 
  }
`);

//I would like User.address to be resolved from the fields in the json response eg. address = Line1, Line2, City

Это схема, которую я определил. Я хотел бы добавить здесь некоторое поведение, которое позволило бы мне проанализировать объект адреса и вернуть объединенное строковое значение.


person achakravarty    schedule 21.09.2016    source источник


Ответы (2)


Как упоминалось HagaiCo и в этой проблеме с github, правильным путем было бы пойти с помощью графических инструментов.

В нем есть функция makeExecutableSchema, которая принимает схему и разрешает функции, а затем возвращает исполняемую схему.

person achakravarty    schedule 23.09.2016

Похоже, у вас здесь путаница, поскольку вы определили этот адрес как String, но вы отправляете словарь для его разрешения.

что вы можете сделать, так это определить тип скалярного адреса: scalar AddressType, если вы используете buildSchema, а затем присоедините к нему функции синтаксического анализа. (или используйте graphql-tools, чтобы сделать это легко)

или создайте тип с нуля, как показано в официальной документации:

var OddType = new GraphQLScalarType({
  name: 'Odd',
  serialize: oddValue,
  parseValue: oddValue,
  parseLiteral(ast) {
    if (ast.kind === Kind.INT) {
      return oddValue(parseInt(ast.value, 10));
    }
    return null;
  }
});

function oddValue(value) {
  return value % 2 === 1 ? value : null;
}

а затем вы можете проанализировать словарь в строку (parseValue), а в противном случае

person HagaiCo    schedule 22.09.2016
comment
Извинения. Я обновил вопрос, переименовав поле «адрес» в объекте в «homeAddress». Поэтому я хочу, чтобы этот объект преобразовался в строку. Мой вопрос больше о том, как добиться этого с помощью нового языка схемы. - person achakravarty; 22.09.2016
comment
новой buildSchema по-прежнему необходимо присоединить резолверы к схеме, она определит скелет, но ей все еще нужно знать, как анализировать / разбирать / разрешать поля - person HagaiCo; 22.09.2016
comment
Да, я в курсе. Просто интересно, есть ли способ добиться этого с помощью новой buildSchema. Мне нравится новый синтаксис, поскольку он кажется намного чище. - person achakravarty; 22.09.2016
comment
Насколько я знаю, вам нужно перебрать поля в схеме и обновить их разрешение / синтаксический анализ / и т. д. вы можете увидеть пример здесь: github.com/apollostack/graphql-tools/blob/master/src/ или вместо этого вы можете использовать graphql-tools и он сделает это за вас, используя эту функцию :) - person HagaiCo; 22.09.2016
comment
Посмотрел и на это репо. Вероятно, пошел бы по этому пути, только если бы не было другого решения. Поддерживая вышеупомянутый комментарий. - person achakravarty; 22.09.2016