【问题标题】:Rolling back resolve function from GraphQLObjectType to another将解析函数从 GraphQLObjectType 回滚到另一个
【发布时间】:2020-04-12 20:14:20
【问题描述】:

我目前正在学习 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
  }
}

【问题讨论】:

    标签: node.js structure graphql-js modularity resolver


    【解决方案1】:

    如果一个字段解析为null,则该图的“分支”的执行结束。即使该字段的类型是对象类型,也不会调用其“子”字段的任何解析器。想象一下,如果你有一个像user 这样的字段——如果该字段解析为null,那么尝试解析用户的nameemail 是没有意义的。

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

    如果你想返回 null 以外的东西,那么你的解析器需要返回 something -- 即使它只是一个空对象 ({})。然后任何“子”字段的解析器都会按预期工作。

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

    【讨论】:

    • 谢谢 - 我会定义它们并将它们保留在根查询级别
    猜你喜欢
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2021-12-16
    • 2011-05-07
    相关资源
    最近更新 更多