Apollo服务器-GraphQL错误:只能存在一种名为“查询”的类型

时间:2019-04-09 20:46:33

标签: javascript node.js express graphql apollo-server

我是GraphQL的新手。我正在遵循Internet上的一些指南,以“创建”一个使用Apollo Server + Express + GraphQL + MongoDB的小型应用程序。

  • 我尝试复制this YT guide(他在 typeDefs 文件夹中创建了 root.js 文件)。
  • This one用于测试。
  • 然后this one来确保我的文件夹结构正确。

我在编译时从GraphQL中获取:

  

错误:只能有一种名为“用户”的类型。

     

错误:只能有一种名为“查询”的类型。

我的代码结构如下:

  • config
  • 模型
  • 解析器
    • index.js
    • user.js
  • typeDefs
    • index.js
    • root.js
    • user.js
  • index.js

直到现在,我的代码如下:

typeDefs / user.js

import { gql } from 'apollo-server-express';

const user = gql`
    type User {
        id: ID!
        name: String
        email: String
        password: String
    }

    type Query {
        getUsers: [User]
    }

    type Mutation {
        addUser(name: String!, email: String!, password: String!): User
    }
`;

export default user;

typeDefs / root.js

import { gql } from 'apollo-server-express';

export default gql`
    extend type Query {
        _: String
    }

    type User {
        _: String
    }
`;

typeDefs / index.js

import root from './root';
import user from './user';

export default [
  root,
  user
];

然后在我的 index.js 中:

import express  from 'express';
import  { ApolloServer, gql } from 'apollo-server-express';

import typeDefs  from './typeDefs';
import resolvers from './resolvers';

const server = new ApolloServer({ typeDefs, resolvers });
const app = express();
server.applyMiddleware({ app });

app.disable('x-powered-by');

app.listen({ port: 4000 }, () => {
  console.log(`Server running at http://localhost:4000${server.graphqlPath}`)
});

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

在遵循深度模块化的模式时,您要在其自己的文件中拥有每个类型定义,并在其自己的文件中拥有每个解析器集,则需要使用 Scanner scan = new Scanner(System.in); System.out.println("Please enter grade."); String gradeLetter = scan.next(); String message = "A"; switch (gradeLetter) { case "A": message = "Excellent!"; break; case "B": message = "Good job."; break; case "C": message = "You passed."; break; case "D": message = "You can do better."; break; case "F": message = "You failed."; break; default: message = gradeLetter + " is invalid."; } System.out.println(message); 关键字并创建“空”定义。

假设您在单独的文件中具有extendroot类型定义,将它们放在一起的索引文件应如下所示:

user

您正在使用

const user = require('./user');
const root= require('./root');
const typeDefs = gql`
    type Query{
        _empty: String
    }
    type Mutation {
        _empty: String
    }
    ${user}
    ${root}
`;

module.exports = typeDefs;

创建一个空的 type Query{ _empty: String } 。然后在最后添加用户和root。

在用户文件中,您需要这样做:

Query

因此, extend type Query { getUsers: [User] } 关键字是您扩展在索引文件中创建的空查询的原因。

您可以在https://blog.apollographql.com/modularizing-your-graphql-schema-code-d7f71d5ed5f2

上阅读有关模块化的更多信息。