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

问题描述 投票:0回答:1

我目前正在研究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结构似乎是正确的方式,所以我猜测问题出在解决功能上,我不知道如何正确定义。

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

{
  "data": {
    "bankRootQuery": null
  }
}
node.js structure graphql-js modularity resolver
1个回答
0
投票

如果字段解析为null,则该图的“分支”的执行结束。即使字段的类型是对象类型,也不会调用其“子级”字段的解析程序。想象一下,如果您有一个类似user的字段-如果该字段解析为null,那么尝试解析用户的nameemail毫无意义。

您用于bankRootQuery字段的解析器仅记录到控制台。由于它没有return语句,因此其返回值为undefinedundefined的值被强制为null。由于该字段解析为null,因此执行暂停。

如果要返回非null的内容,那么您的解析器需要返回something

-即使它只是一个空对象({})。然后,任何“子”字段的解析器将按预期工作。

通常,我建议您不要像这样嵌套查询-只需将其保留在根级别即可。有关场分辨率如何工作的其他详细信息,请查看this post

© www.soinside.com 2019 - 2024. All rights reserved.