最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

深查询嵌套类型GraphQL返回NULL

运维笔记admin13浏览0评论

深查询嵌套类型GraphQL返回NULL

深查询嵌套类型GraphQL返回NULL

有一个奇怪的问题?

查询到嵌套类型返回null。

但是,如果我在父类返回任何东西 - 解决返回正确的结果

我的代码:

import { GraphQLList, GraphQLString, GraphQLID, GraphQLObjectType, GraphQLSchema } from 'graphql';
import AdminModel from '../models/Admin.model';

const AdminType = new GraphQLObjectType({
    name: 'AdminType',
    fields: {
        _id: { type: GraphQLID },
        login: { type: GraphQLString },
        password: { type: GraphQLString }
    }
});

const AdminRooteType = new GraphQLObjectType({
    name: 'AdminRooteType',
    fields: {
        getAdmins: {
            type: new GraphQLList(AdminType),
            resolve() {
                return AdminModel.find({})
            }
        }
    }
})

export default new GraphQLSchema({ 
    query: new GraphQLObjectType({
        name: 'RootQuery',
        fields: {
            admin: {
                type: AdminRooteType,
                resolve() {
                   // EMPTY RESOLVE - EMPTY RESULT
                }
            }
        }
    })
 });

查询:

{
  admin {
    getAdmins {
      login
    } 
  }
}

结果:

{
  "data": {
    "admin": null
  }
}

如果我在RootQuery管理领域改变返回值:

import { GraphQLList, GraphQLString, GraphQLID, GraphQLObjectType, GraphQLSchema } from 'graphql';
import AdminModel from '../models/Admin.model';

const AdminType = new GraphQLObjectType({
    name: 'AdminType',
    fields: {
        _id: { type: GraphQLID },
        login: { type: GraphQLString },
        password: { type: GraphQLString }
    }
});

const AdminRooteType = new GraphQLObjectType({
    name: 'AdminRooteType',
    fields: {
        getAdmins: {
            type: new GraphQLList(AdminType),
            resolve() {
                return AdminModel.find({})
            }
        }
    }
})

export default new GraphQLSchema({ 
    query: new GraphQLObjectType({
        name: 'RootQuery',
        fields: {
            admin: {
                type: AdminRooteType,
                #resolve() {#
                    #// RETURN ANYTHING HERE:#
                  #  return 'foobar'#
                }
            }
        }
    })
 });

我已经得到了预期的结果:

{
  "data": {
    "admin": {
      "getAdmins": [
        {
          "login": "123"
        },
        {
          "login": "12asdf3"
        }
      ]
    }
  }
}

什么是这个问题的正确解决方案? (无回报使用虚拟值)

非常感谢!

回答如下:

你们看到的是预期的行为。试想一下,我们有一些字段User类型:

const UserType = new GraphQLObjectType({
  name: 'User',
  fields: {
    id: { type: GraphQLID },
    name: { type: GraphQLString },
  }
})

和一种方式来获取单个用户:

const QueryType = new GraphQLObjectType({
  name: 'Query',
  fields: {
    user: {
      type: AdminRooteType,
      resolve: () => getUser(),
    },
  },
})

如果getUser返回表示User的对象,对于所有的字段相器(即id并在name类型User将被调用。

当这些字段(和任何子领域,他们可能有)解决,你最终用户对象为整个user场返回。的响应可能看起来是这样的:

"data": {
  "user": {
    "id": 1,
    "name": "Maria",
    "comments": [
      {
        "id": 1,
        // and so on...
      }
    ]
  }
}

现在,考虑当用户没有找到会发生什么,我们返回NULL来代替。我们的回答是这样的:

"data": {
  "user": null
}

它没有意义调用任何解析器为用户领域。你考虑API仍然返回在这种情况下的idname?如果那样,将这些领域有什么价值?如果我们只是返回一个空idname,如何将客户区分是存在,但确实有idname空值的用户该对象?

问题是,如果一个字段返回一个GraphQLObjectType,它解析为空,没有对GraphQLObjectType解析器会被调用。

通过嵌套不必要的另一个GraphQLObjectType里面你getAdmins场,你不得不返回某种对象的解析器内的admin。所以,你要么需要住在一起,或完全避免创建AdminRootType而直接把getAdmins领域上的查询类型,按约定:

const QueryType = new GraphQLObjectType({
  name: 'Query',
  fields: {
    getAdmins: {
      type: new GraphQLList(AdminType),
      resolve: () => AdminModel.find({}),
    },
  },
})
发布评论

评论列表(0)

  1. 暂无评论