将解析函数从 GraphQLObjectType 回滚到另一个

Rolling back resolve function from GraphQLObjectType to another

我目前正在学习 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 工作得很好,但是在使用 GraphiQL 查询时使用 rootQuery 会产生空结果 - Documentation Explorer 结构似乎是正确的方式,所以我猜问题出在 resolve 函数上,我不明白如何正确定义它。

这是使用 GraphQL 查询时的结果:

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

如果字段解析为 null,则图的 "branch" 的执行结束。即使字段的类型是对象类型,也会调用其 "children" 字段的 none 个解析器。想象一下,如果您有一个像 user 这样的字段——如果该字段解析为 null,那么尝试解析用户的 nameemail 是没有意义的。

bankRootQuery 字段的解析器只记录到控制台。因为它没有 return 语句,所以它的 return 值为 undefinedundefined 的值被强制转换为 null。由于该字段解析为空,执行停止。

如果你想 return 不是 null 的东西,那么你的解析器需要 return 东西 -- 即使它只是一个空对象 ( {})。然后任何 "child" 字段的解析器将按预期工作。

一般来说,我建议不要像这样嵌套您的查询 - 只需将它们保留在根级别即可。有关字段解析如何工作的更多详细信息,请查看