Apollo Server - GraphQL 错误:只能有一种名为“查询”的类型

Mar*_*mal 10 javascript node.js express graphql apollo-server

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

  • 我试图复制这个YT指南(他创造root.js上的文件类型定义文件夹)。
  • 这一个用于测试目的。
  • 这一次,以确保我的文件夹结构是正确的。

编译时我从 GraphQL 得到:

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

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

我的代码结构如下:

  • 配置
  • 楷模
  • 解析器
    • 索引.js
    • 用户.js
  • 类型定义
    • 索引.js
    • 根.js
    • 用户.js
  • 索引.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;
Run Code Online (Sandbox Code Playgroud)

typeDefs/root.js

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

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

    type User {
        _: String
    }
`;
Run Code Online (Sandbox Code Playgroud)

typeDefs/index.js

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

export default [
  root,
  user
];
Run Code Online (Sandbox Code Playgroud)

然后在我的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}`)
});
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

pac*_*aux 23

当遵循深度模块化的模式时,您希望将每个类型定义放在自己的文件中,并将每组解析器放在自己的文件中,您希望使用extend关键字并创建“空”定义。

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

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

module.exports = typeDefs;
Run Code Online (Sandbox Code Playgroud)

你正在使用

    type Query{
        _empty: String
    }
Run Code Online (Sandbox Code Playgroud)

做一个空的Query。然后你在最后添加你的用户和 root。

在您的用户文件中,您需要:

    extend type Query {
        getUsers: [User]
    }
Run Code Online (Sandbox Code Playgroud)

所以extend关键字是您扩展您在索引文件中创建的空查询。

您可以在此处阅读有关模块化的更多信息https://blog.apollographql.com/modularizing-your-graphql-schema-code-d7f71d5ed5f2