错误:预期[object]为GraphQL类型

错误:预期[object]为GraphQL类型,graphql,express-graphql,Graphql,Express Graphql,在我将参考资料部分添加到代码中之前,此代码一直有效。它与其他两个类似,所以我不确定它为什么不起作用 提前谢谢 更新:- 在使用调试器之后,我逐渐了解到问题出在RootQueryType.js以及与之相关的文件中,因为当我尝试导出模式时,错误会弹出,并且正好出现在query:RootQueryType位置,但仍然无法确定错误 更新:- 最后我也放了schema.js文件 resourceType.js const graphql = require("graphql"); const UserTy

在我将参考资料部分添加到代码中之前,此代码一直有效。它与其他两个类似,所以我不确定它为什么不起作用

提前谢谢

更新:- 在使用调试器之后,我逐渐了解到问题出在RootQueryType.js以及与之相关的文件中,因为当我尝试导出模式时,错误会弹出,并且正好出现在query:RootQueryType位置,但仍然无法确定错误

更新:- 最后我也放了schema.js文件

resourceType.js

const graphql = require("graphql");
const UserType = require("./userType");
const User = require("../models/User");
const Project = require("../models/Project");
const Resource = require("../models/Resource");
const ProjectType = require("./projectType");

const {
    GraphQLObjectType,
    GraphQLString,
    GraphQLList,
  } = graphql;


  const ResourceType = new GraphQLObjectType({
    name: "ResourceType",
    fields: () => ({
      id: { type: GraphQLString },
      title: { type: GraphQLString },
      url: { type: GraphQLString },
      project:{
        type:ProjectType,
        resolve(parentValues,args){
          return Project.findById(parentValues.id).populate("resources")
        }
      }
    })
  });

  module.exports=ResourceType;
RootQueryType.js

    const mongoose = require('mongoose');
const graphql = require('graphql');
const { GraphQLObjectType, GraphQLList, GraphQLID, GraphQLNonNull } = graphql;

const ProjectType  = require('./../types/projectType');
const UserType  = require('./../types/userType');
const Project=require("../models/Project");
const User=require("../models/User");

 const RootQuery=new GraphQLObjectType({
    name:"RootQueryType",
    fields: () => ({
        projects:{
            type:new GraphQLList(ProjectType),
            resolve(parentValues,args,request){
                return Project.find().populate("contributors").populate("resources");
            }
        },
        project:{
            type:ProjectType,
            args:{id:{type:new GraphQLNonNull(GraphQLID)}},
            resolve(parentValue,args,request){
                return Project.findById(args.id).populate("contributors").populate("resources");
            }
        },
        users:{
            type:new GraphQLList(UserType),
            resolve(parentValues,args,request){
                return User.find().populate("projects");
            }
        },
        user:{
            type:UserType,
            args:{id:{type:new GraphQLNonNull(GraphQLID)}},
            resolve(parentValue,args,request){
                return User.findById(args.id).populate("projects")
            }
        },

    })
})

module.exports = RootQuery;
突变

    const mongoose = require("mongoose");
const ProjectType = require("./../types/projectType");
const UserType = require("./../types/userType");
const graphql = require("graphql");
const {
  GraphQLObjectType,
  GraphQLList,
  GraphQLID,
  GraphQLNonNull,
  GraphQLString
} = graphql;

const Project = require("../models/Project");
const User = require("../models/User");

const mutation = new GraphQLObjectType({
  name: "mutation",
  fields: () => ({
    addUser: {
      type: UserType,
      args: {
        name: { type: new GraphQLNonNull(GraphQLString) },
        username: { type: new GraphQLNonNull(GraphQLString) },
        password: { type: new GraphQLNonNull(GraphQLString) },
        email: { type: new GraphQLNonNull(GraphQLString) },
        githubProfile: { type: new GraphQLNonNull(GraphQLString) }
      },
      resolve(parentValues, args, request) {
        return User.create(args);
      }
    },
    addProject: {
      type: ProjectType,
      args: {
        name: { type: new GraphQLNonNull(GraphQLString) },
        description: { type: new GraphQLNonNull(GraphQLString) },
        image: { type:GraphQLString },
        // contributor:{ type: new GraphQLNonNull(new GraphQLList(GraphQLID))
        contributor:{ type: new GraphQLNonNull(GraphQLID)
         },
      },
      resolve(parentValues, args, request) {
        return Project.create(args);
      }
    }
  })
});

module.exports = mutation;
我敢肯定这不是其他类型的问题,因为它们在早期工作,我只在它们的resolve函数中添加了.populate(“resources”)属性。但以防万一,我也在为他们添加代码

userType.js

const graphql = require("graphql");
const ProjectType = require("./projectType");

const { GraphQLObjectType, GraphQLString, GraphQLList } = graphql;

const UserType = new GraphQLObjectType({
  name: "User",
  fields: () => ({
    id: { type: GraphQLString },
    name: { type: GraphQLString },
    githubProfile: { type: GraphQLString },
    username: { type: GraphQLString },
    password: { type: GraphQLString },
    email: { type: GraphQLString },
    projects: {
      type: new GraphQLList(ProjectType),
      resolve(parentValues, args) {
        return User.findById(parentValues.id).populate("projects");
      }
    }
  })
});

module.exports = UserType;
另一个是

projectType.js

const graphql = require("graphql");
const UserType = require("./userType");
const ResourceType = require("./resourceType");
const User = require("../models/User");
const Project = require("../models/Project");

const {
  GraphQLObjectType,
  GraphQLString,
  GraphQLList,
} = graphql;

const ProjectType = new GraphQLObjectType({
  name: "ProjectType",
  fields: () => ({
    id: { type: GraphQLString },
    name: { type: GraphQLString },
    description: { type: GraphQLString },
    image: { type: GraphQLString },
    contributors: {
      type: new GraphQLList(UserType),
      resolve(parentValues, args, request) {
        return Project.findContributors(parentValues.id);
      }
    },
    resources:{
      type: new GraphQLList(ResourceType),
      resolve(parentValues, args, request) {
        return Project.findResources(parentValues.id);
      }
    }
  })
});

module.exports=ProjectType;
schema.js

const graphql = require("graphql");
const RootQuery = require("./RootQueryType");
const Mutation = require("./Mutation");

const { GraphQLSchema } = graphql;

console.log(RootQuery,Mutation);

module.exports = new GraphQLSchema({
  query: RootQuery,
  mutation: Mutation
});
更新:-我已经删除了资源文件,但仍然收到相同的错误,因此它必须介于用户和项目类型之间


更新:-我终于找到了项目和用户类型的类型文件中的错误,它是由新的GraphQList引起的,我仍然没有解决错误,但删除它似乎可以消除错误,不知道为什么。

您的问题是
userType
projectType
模块之间的循环依赖关系。因此,当const值被传递到
graphqlist
时,它仍然是一个空对象

作为解决方案,您可以将所有类型移动到一个模块中。或者,在导出类时,将它们设置为
模块的属性。导出
。这将起作用,因为您将字段正确定义为thunks


顺便说一下,在创建
graphqlist
GraphQLNonNull
包装器时,不需要
new
。但这并不是你得到错误的原因。

最终解决了问题,正如@cito所说,因为循环依赖性是导致错误的原因,也就是说,我的用户类型依赖于项目类型,因此我得到了这个错误,这是由

const graphql = require("graphql");

const User = require("../models/User");
const Project = require("../models/Project");

const {
  GraphQLObjectType,
  GraphQLString,
  GraphQLList,
} = graphql;

const ProjectType = new GraphQLObjectType({
  name: "ProjectType",
  fields: () => ({
    id: { type: GraphQLString },
    name: { type: GraphQLString },
    description: { type: GraphQLString },
    image: { type: GraphQLString },
    contributors: {
      type: new GraphQLList(UserType),
      resolve(parentValues, args, request) {
        return Project.findContributors(parentValues.id);
      }
    },
    resources:{
      type: new GraphQLList(ResourceType),
      resolve(parentValues, args, request) {
        return Project.findResources(parentValues.id);
      }
    }
  })
});

module.exports=ProjectType;



// This is here to prevent circular dependencies problem which will lead to the formation of infinite loop

const UserType = require("./userType");
const ResourceType = require("./resourceType");
这需要底部的文件

另一种方法是:

resources:{
      // require directly without creating a new variable
      type: new GraphQLList(require("./resourceType")),

      resolve(parentValues, args, request) {
        return Project.findResources(parentValues.id);
      }
    }

实际上构建
GraphQLSchema
对象的代码是什么样子的?@Mord Zuber我把schema.js代码放在了最后。我想知道
name:“RootQueryType”,
是否需要
name:“query”,
?事实上,在我添加resources.js部分并集成它之前,整个过程都在运行,所以我认为这不是问题所在