Откат функции разрешения из GraphQLObjectType в другую - PullRequest
0 голосов
/ 12 апреля 2020

В настоящее время я изучаю GraphQL и, как часть процесса разработки, меня интересует модульность моего кода - я понимаю, как писать запрос, но не понимаю, как правильно реализовать запрос запросов.

Это rootQuery. js

const {
  GraphQLInt,
  GraphQLList,
  GraphQLObjectType,
  GraphQLSchema,
  GraphQLFloat,
  GraphQLString
} = require("graphql");

const bankRootQuery = require('../graphql/queries/bank.queries')

const rootQuery = new GraphQLObjectType({
  name: "rootQuery",
  fields: {
    bankRootQuery: { type: bankRootQuery, resolve: () => { console.log(bankRootQuery.resolve) } } 
  }
});
module.exports = new GraphQLSchema({
  query: rootQuery
});

А вот bankRootQuery. js:

const { GraphQLObjectType, GraphQLInt, GraphQLNonNull, GraphQLID, GraphQLList } = require("graphql");

  const BankType = require('../types/bank.type');
  const models = require('../../models/models_handler');

module.exports = new GraphQLObjectType({
    name: "bankRootQuery",
    fields: {
        getbanks: {
            type: new GraphQLList(BankType),
            resolve: () => {
                return models.getBanks()
            }
        },
        getbankByID: {
            type: BankType,
            args: {
              bankID: { name: "bankID", type: GraphQLInt }
            },
            resolve: (_, args) =>  { 
                if (!models.getBanks().has(args.bankID))
                    throw new Error(`Bank with ID ${args.bankID} doesn't exists`);
                return models.getBank(args.bankID);}
        }
    }
});

Назначение bankRootQuery объекту схемы вместо rootQuery работает отлично, но использование rootQuery дает нулевой результат при запросах с использованием GraphiQL - Структура Documentation Explorer, кажется, работает должным образом, поэтому я предполагаю, что проблема в функции разрешения, которую я не не понимаю, как правильно определить.

Вот результат при запросе с использованием GraphQL:

{
  "data": {
    "bankRootQuery": null
  }
}

1 Ответ

0 голосов
/ 12 апреля 2020

Если поле разрешается в null, то выполнение для этой «ветви» графа заканчивается. Даже если тип поля является типом объекта, не будет вызван ни один из преобразователей для его «дочерних» полей. Представьте, что у вас есть поле типа user - если поле разрешается до null, то нет смысла пытаться разрешить пользовательский name или email.

Ваш преобразователь для Поле bankRootQuery просто входит в консоль. Поскольку у него нет оператора return, его возвращаемое значение равно undefined. Значение undefined приводится к null. Поскольку поле разрешено в ноль, выполнение останавливается.

Если вы хотите вернуть что-то, отличное от нуля, то ваш распознаватель должен вернуть что-то - даже если это просто пустой объект ({}). Тогда средства распознавания для любых «дочерних» полей будут работать, как и ожидалось.

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

...