Получение ошибки в Apollo Express GraphQL: Ошибка: Схема должна содержать типы с уникальными именами, но содержит несколько типов с именем «Дата-время»

#javascript #node.js #express #graphql #apollo-server

Вопрос:

Я пытаюсь использовать import { applyMiddleware } from 'graphql-middleware'; библиотеку для добавления промежуточного программного обеспечения проверки при вводе мутации.

Итак, я создал пример функции промежуточного программного обеспечения, которая является входом в журнал

 export const logInput = async (resolve, root, args, context, info) => {
    console.log(`1. logInput: ${JSON.stringify(args)}`);
    const result = await resolve(root, args, context, info);
    console.log(`5. logInput`);
    return resu<
};
 

Теперь я в соответствии с документацией graphql-middleware , передаю существующую schemas и middlewares applyMiddleware() которой предоставлена graphql-middleware библиотека.

graphql/index.js файл содержит: Итак , этот файл содержит код, который объединяет все schemas , types и resolvers .

 import { gql, makeExecutableSchema } from 'apollo-server-express';
import { merge } from 'lodash';
import { GraphQLJSONObject } from 'graphql-type-json';
import { GraphQLDateTime } from 'graphql-iso-date';
import { policyType, policyResolver, policySchema } from './policy';

import {
    gitProviderTypes,
    gitProviderResolver,
    gitProviderSchema,
} from './gitProvider';

const Root = gql`
    scalar JSON
    scalar JSONObject
    scalar GraphQLDateTime

    type MyType {
        myValue: JSON
        myObject: JSONObject
        myDate: GraphQLDateTime
    }

    type Query {
        _empty: String
    }
    type Mutation {
        _empty: String
    }
    schema {
        query: Query
        mutation: Mutation
    }
`;

const resolvers = merge(
    { JSONObject: GraphQLJSONObject, GraphQLDateTime },
    policyResolver,
    gitProviderResolver
);

export default makeExecutableSchema({
    typeDefs: [
        Root,
        policyType,
        policySchema,
        gitProviderTypes,
        gitProviderSchema,
    ],
    resolvers,
});
 

Пример файла , который содержит все types , есть много файлов для обработки других ресурсов

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

export default gql`
    type CreatePolicyResult {
        id: String
        name: String
        adopted: Boolean
        markdown: String
    }

    type CreateProcedureResult {
        id: String
        type: String
        name: String
        file: String
        provider: String
        adopted: Boolean
        summary: String
        guidance: String
        applicable: Boolean
    }

    type Policy {
        _id: ID
        id: String
        name: String
        adopted: Boolean
        tags: [String]
        procedures: [Procedure]
        markdown: String
        html: String
        file: String
    }

    type Procedure {
        _id: ID
        id: String
        type: String
        name: String
        summary: String
        applicable: String
        provider: String
        guidance: String
        adopted: String
        tags: [String!]
        markdown: String
        html: String
        file: String
    }

    input ProcedureInput {
        id: String
        type: String
        name: String
        summary: String
        applicable: Boolean
        provider: String
        guidance: String
        adopted: Boolean
        tags: [String]
        markdown: String
    }

    input CreateProcedureInput {
        id: String!
        type: String!
        name: String!
        markdown: String!
        provider: String!
        adopted: Boolean!
        summary: String
        guidance: String
        applicable: Boolean!
    }

    input PolicyInput {
        id: String!
        name: String!
        adopted: Boolean!
        markdown: String!
    }

    input UpdatePolicyInput {
        id: String
        name: String
        adopted: Boolean
        tags: [String]
        markdown: String
    }

    input OrganizationInput {
        companyFullName: String!
        companyShortName: String!
        companyEmailDomain: String!
        companyWebsiteURL: String!
        securityOfficerName: String!
        securityOfficerEmail: String!
        ctoName: String!
        ctoEmail: String!
        sourceControl: String!
        ticketingSystem: String!
        ciSystem: String!
        privacyPolicyURL: String!
        supportBYODandMDM: Boolean!
    }
`;
 

express.js file contains:

 import { ApolloServer } from 'apollo-server-express';
import { applyMiddleware } from 'graphql-middleware';
import schema from './graphql';
import { logInput } from './graphql/middlewares';

 const schemaWithMiddleware = applyMiddleware(schema, logInput);

    //Here schema is imported from file and logInput is middleware

    //GraphQL Server
    const server = new ApolloServer({
        schema,
        context: async ({ req, res }) => ({ req, res }),
    });
 

Всякий раз, когда я пытаюсь использовать schema с applyMiddleware() , выдает ошибку, когда я пытаюсь использовать его напрямую, как это, он работает без каких-либо проблем.

 import { ApolloServer } from 'apollo-server-express';
import { applyMiddleware } from 'graphql-middleware';
import schema from './graphql';
import { logInput } from './graphql/middlewares';

  //Not using this time, now works without any problem
  //const schemaWithMiddleware = applyMiddleware(schema, logInput);

    //GraphQL Server
    const server = new ApolloServer({
        schema: schema,
        context: async ({ req, res }) => ({ req, res }),
    });
 

Ошибка броска:

 node:14152) UnhandledPromiseRejectionWarning: Error: Schema must contain uniquely named types but contains multiple types named "DateTime".
    at new GraphQLSchema (G:nanohealtegopolicy-builder-servicenode_modulesgraphqltypeschema.js:194:15)
    at Object.mapSchema (G:nanohealtegopolicy-builder-servicedistutilssrcmapSchema.js:31:12)
    at createNewSchemaWithResolvers (G:nanohealtegopolicy-builder-servicedistschemasrcaddResolversToSchema.js:200:14)
    at Object.addResolversToSchema (G:nanohealtegopolicy-builder-servicedistschemasrcaddResolversToSchema.js:87:11)
    at addMiddlewareToSchema (G:nanohealtegopolicy-builder-servicenode_modulesgraphql-middlewaresrcmiddleware.ts:42:21)
    at normalisedMiddlewares.reduceRight.schema.schema (G:nanohealtegopolicy-builder-servicenode_modulesgraphql-middlewaresrcmiddleware.ts:91:11)
    at Array.reduceRight (<anonymous>)
    at applyMiddlewareWithOptions (G:nanohealtegopolicy-builder-servicenode_modulesgraphql-middlewaresrcmiddleware.ts:80:77)
    at Object.applyMiddleware (G:nanohealtegopolicy-builder-servicenode_modulesgraphql-middlewaresrcmiddleware.ts:132:10)
    at Object.exports.default (G:nanohealtegopolicy-builder-servicesrcloadersexpress.ts:28:34)
    at Object.exports.default (G:nanohealtegopolicy-builder-servicesrcloadersindex.ts:14:24)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at startServer (G:nanohealtegopolicy-builder-servicesrcserver.ts:16:5)
(node:14152) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:14152) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
 

Я поискал в Интернете, но не смог найти решение.

Комментарии:

1. Ошибка указывает на mapSchema.js строку 31. Есть ли этот файл в вопросе, и если да, то какой именно?

2. mapSchema.js В моем проекте нет файла с таким названием, я думаю, это где-то в какой-то библиотеке

3. Этот файл находится в папке dist/utils/src, а не в папке node_modules. Откуда берутся эти файлы? Возможно, это скомпилированный машинописный текст? На этот файл ссылается dist/schema/src/addResolversToSchema.js.

4. Да, я использую здесь машинописный текст, но я не вижу build здесь никакой папки. Я использую Nodemon для разработки

5. Можете ли вы опубликовать код dist/utils/src/mapSchema.js файла, по крайней мере, в строке 31? И строка 200 из distschemasrcaddResolversToSchema.js ?

Ответ №1:

Странно, но проблема была в этом import { GraphQLDateTime } from 'graphql-iso-date'; пакете.

После удаления его из схемы он начал работать.

 import { gql, makeExecutableSchema } from 'apollo-server-express';
import { merge } from 'lodash';
import { GraphQLJSONObject } from 'graphql-type-json';
import { policyType, policyResolver, policySchema } from './policy';

import {
    gitProviderTypes,
    gitProviderResolver,
    gitProviderSchema,
} from './gitProvider';

const Root = gql`
    scalar JSON
    scalar JSONObject

    type MyType {
        myValue: JSON
        myObject: JSONObject
    }

    type Query {
        _empty: String
    }
    type Mutation {
        _empty: String
    }
    schema {
        query: Query
        mutation: Mutation
    }
`;

const resolvers = merge(
    { JSONObject: GraphQLJSONObject },
    policyResolver,
    gitProviderResolver
);

const typeDefs = [
    Root,
    policyType,
    policySchema,
    gitProviderTypes,
    gitProviderSchema,
];

export default makeExecutableSchema({
    typeDefs,
    resolvers,
});