【问题标题】:GraphQL error: Expected GraphQL named type but got: {}GraphQL 错误:预期的 GraphQL 命名类型,但得到:{}
【发布时间】:2019-08-14 08:25:32
【问题描述】:

我有 2 个自定义 graphql 类型,entityType 和 containerType,其中 1 个容器可以有多个实体。

所以,我通过以下代码将所有实体与它们各自的容器绑定:

const graphql = require('graphql')
const _ = require('lodash')

const UserType = require('./userSchema')
const ContainerType = require('./containerSchema')

const Container = require('../models/container')
const Entity = require('../models/entity')
const {
    GraphQLObjectType, 
    GraphQLString,
    GraphQLBoolean,
    GraphQLSchema,
    GraphQLInt,
    GraphQLID,
    GraphQLList,
    GraphQLNonNull,
    GraphQLUnionType
} = graphql

const EntityType = new GraphQLObjectType({
    name: "Entity",
    fields: () => ({
        name: { type: new GraphQLNonNull(GraphQLString) },
        container: { 
            type: ContainerType,
            resolve: function(parent, args) {
                return Container.findById(parent.containerId)
            } 
        },
        type: { type: new GraphQLNonNull(GraphQLString) },
        detail: { type: new GraphQLNonNull(GraphQLString) },
        start: { type: GraphQLString },
        end: { type: GraphQLString }
    })
})
module.exports = { EntityType }

我很确定 containerType 正在工作,因为我正在使用它,它正在其他地方使用并且运行良好。下面是容器类型的代码:

const graphql = require('graphql')
const _ = require('lodash')

const UserType = require('./userSchema')
const { EntityType } = require('./entitySchema')

const User = require('../models/user')
const Container = require('../models/container')
const Entity = require('../models/entity')

const { 
    GraphQLObjectType, 
    GraphQLString,
    GraphQLBoolean,
    GraphQLSchema,
    GraphQLInt,
    GraphQLID,
    GraphQLList,
    GraphQLNonNull
} = graphql

const ContainerType = new GraphQLObjectType ({
    name: 'Container',
    fields: () => ({
        id: { type: GraphQLID },
        name: { type: GraphQLString },
        user: { 
            type: UserType,
            resolve: function (parent, args) {
                return User.findById(parent.userId)
            }
        },
        parent: {
            type: ContainerType,
            resolve: function (parent, args) {
                return Container.findById(parent.parentContainer)
            }
        },
        detail: { type: GraphQLString },
        start: { type: GraphQLString },
        end: { type: GraphQLString },
        createdAt: { type: GraphQLString },
        category: { type: GraphQLString },
        status: { type: GraphQLString },
        entities: {
            type: GraphQLList(EntityType),
            resolve: async function(parent, args) {
                return await Entity.find({ containerId: parent.id })
            }
        }
    })
})



module.exports = ContainerType

终端上没有显示错误,但 Graphiql 控制台在加载时显示以下错误:

{
  "errors": [
    {
      "message": "The type of Entity.container must be Output Type but got: {}."
    },
    {
      "message": "Expected GraphQL named type but got: {}."
    }
  ]
}

【问题讨论】:

    标签: graphql


    【解决方案1】:

    我发现问题出在所谓的“模块周期”上。 this post 对解决它很有帮助。

    最后,我最终在一个文件中添加了 EntitySchema 和 ContainerSchema,代码如下:

    const graphql = require('graphql')
    const _ = require('lodash')
    
    const UserType = require('./userSchema')
    
    const User = require('../models/user')
    const Container = require('../models/container')
    const Entity = require('../models/entity')
    
    const { 
        GraphQLObjectType, 
        GraphQLString,
        GraphQLBoolean,
        GraphQLInt,
        GraphQLID,
        GraphQLList,
        GraphQLNonNull
    } = graphql
    
    const EntityType = new GraphQLObjectType ({
        name: "Entity",
        fields: () => ({
            name: { type: new GraphQLNonNull(GraphQLString) },
            container: { 
                type: ContainerType,
                resolve: (parent, args) => {
                    return Container.findById(parent.containerId)
                }
            },
            type: { type: new GraphQLNonNull(GraphQLString) },
            detail: { type: new GraphQLNonNull(GraphQLString) },
            start: { type: GraphQLString },
            end: { type: GraphQLString }
        })
    })
    
    const ContainerType = new GraphQLObjectType ({
        name: 'Container',
        fields: () => ({
            id: { type: GraphQLID },
            name: { type: GraphQLString },
            user: { 
                type: UserType,
                resolve: function (parent, args) {
                    return User.findById(parent.userId)
                }
            },
            parent: {
                type: ContainerType,
                resolve: function (parent, args) {
                    return Container.findById(parent.parentContainer)
                }
            },
            detail: { type: GraphQLString },
            start: { type: GraphQLString },
            end: { type: GraphQLString },
            createdAt: { type: GraphQLString },
            category: { type: GraphQLString },
            status: { type: GraphQLString },
            entities: {
                type: GraphQLList(EntityType),
                resolve: async function(parent, args) {
                    return await Entity.find({ containerId: parent.id })
                }
            }
        })
    })
    
    module.exports = {
        EntityType, 
        ContainerType
    }
    

    【讨论】:

      猜你喜欢
      • 2020-06-01
      • 2018-11-27
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      • 2018-06-28
      • 2022-12-05
      • 2019-09-19
      相关资源
      最近更新 更多