zoukankan      html  css  js  c++  java
  • GraphQL循环引用的问题

    下面的代码中, 由于friends字段引用了PersonType字段,而friends本身又是PersonType的一部分,在运行的时候会报错:

    Expected undefined to be a GraphQL type

    var PersonType = new GraphQLObjectType({

        name: 'Person',

        description: '...',

        fields: {

                    id: {

                        type: GraphQLString,

                        resolve : function (person) {

                            return person.first_name;

                        }

                    },

                    firstName: {

                        type: GraphQLString,

                        resolve : function (person) {

                            return person.first_name;

                        }

                    },

                    lastName: {

                        type: GraphQLString,

                        resolve : function (person) {

                            return person.last_name;

                        }

                    },

                    department: {

                        type: GraphQLString,

                        resolve : function (person) {

                            return person.department;

                        }

                    },

                    //email: { type: GraphQLString },

                    //userName: { type: GraphQLString },

                    //id: { type: GraphQLString },

                    friends:  {

                         type: GraphQLList(PersonType)

                        //resolve: function (person) {

                        //    //return person.friends.map(getPersonByUrl);

                        //    return person.friends;

                        //}

                        }

                }

    });

    原因在于GraphQLList初始化的时候会检查PersonType的类型,而此时PersonType的定义尚未完成,所以还是undefined, 所以会报上面的错误.

    [解决方案]

    搜索到了这篇文章: https://gist.github.com/fbaiodias/77406c29ddf37fe46c3c

    Fix

    Using a function to return the fields on author.js does the trick:

    On author.js

    @@ -13 +13 @@

    -   fields: {

    +   fields: () => ({

    把代码改成下面的就可以了.

    var PersonType = new GraphQLObjectType( {

        name: 'Person',

        description: '...',

        fields: ()=>({

            id: {

                type: GraphQLString,

                resolve : function (person) {

                    return person.first_name;

                }

            },

            firstName: {

                type: GraphQLString,

                resolve : function (person) {

                    return person.first_name;

                }

            },

            lastName: {

                type: GraphQLString,

                resolve : function (person) {

                    return person.last_name;

                }

            },

            department: {

                type: GraphQLString,

                resolve : function (person) {

                    return person.department;

                }

            },

            //email: { type: GraphQLString },

            //userName: { type: GraphQLString },

            //id: { type: GraphQLString },

            friends: {

                type: GraphQLList(PersonType)

                        //resolve: function (person) {

                        //    //return person.friends.map(getPersonByUrl);

                        //    return person.friends;

                        //}

            }

        })

    });

    原理就是把fields放到函数中后,会在另一个线程中执行,所以执行的时候PersonType已经创建完成,所以就不会报错了.

  • 相关阅读:
    Linux下通过二进制方式安装mysql5.7版本和系统优化
    SQL中的real、float、decimal、numeric数据类型区别
    SQL中的事务ACID
    一台服务器搭建部署两个或多个Redis实例
    SQLServer数据库镜像高性能模式下维护
    SQLServer配置镜像,无法将 ALTER DATABASE 命令发送到远程服务器实例,数据库镜像配置未更改。请确保该服务器已连接,然后重试。
    阿里云数据库MongoDB版清理oplog日志和compact命令详解
    Linux下shell脚本实现mongodb定时自动备份
    List分组
    Sql Server日期查询-SQL查询今天、昨天、7天内、30天
  • 原文地址:https://www.cnblogs.com/time-is-life/p/9293730.html
Copyright © 2011-2022 走看看