错误:架构必须包含唯一命名的类型,但包含多个名为“DateTime”的类型

BUR*_*101 2 node.js graphql-js typegraphql

我正在尝试生成一个 GraphQL 模式。

我有以下解析器。他们三个在不同的文件中。其中 2 个用于收集数据,而其中一个只是一个触发器 API,用于让它们从数据源收集更多数据。

@Resolver()
export class RefreshDataSchema{
    constructor(
        private readonly aggregatedDataService : AggregateDataService
    ){}

    @Mutation(() => Boolean)
    async refreshTransactions() : Promise<Boolean>{
        Logger.info("Refresh transactions mutation received.");
        return await this.aggregatedDataService.fetchAndAggregateTransactions();
    }

    @Mutation(() => Boolean)
    async refreshAccounts() : Promise<Boolean>{
        Logger.info("Refresh accounts mutation received.");
        return await this.aggregatedDataService.fetchAndAggregateAccounts();
    }
}

@Resolver(() => Account)
export class AccountSchema extends Account{

    @Query(() => Account)
    async getAccount(
        @Arg('query', () => AccountQuery)
        query: AccountQuery,
    ) {
        const data = await Account.findOne({ where: query });
        if (data === undefined) {
            throw new Error(`Account for query "${JSON.stringify(query)}" could not be found!`);
        }
        return data;
    }

    @Query(() => [Account])
    async getAccounts(
        @Arg('query', () => AccountQuery)
        query: AccountQuery,
        @Arg('first', { defaultValue: 10 })
        first: number = 10,
        @Arg('offset', { defaultValue: 0 })
        offset: number = 0,
    ) {
        Logger.info(`GraphQL Query: get accounts. @First: ${first} @Offset: ${offset} received.`);
        const data = Account.find({
            take: first,
            skip: offset,
            order: { balance_in_cents: 'DESC' },
            where: query,
        });

        if(data === undefined){
            throw new Error(`Account for query "${JSON.stringify(query)}" could not be found!`);
        }

        return data;
    }

};

@Resolver(() => Transaction)
export class TransactionSchema extends Transaction{

    @Query(() => [Transaction])
    async getTransactions(
        @Arg('query', () => TransactionQuery)
        query: TransactionQuery,
        @Arg('first', { defaultValue: 10 })
        first: number = 10,
        @Arg('offset', { defaultValue: 0 })
        offset: number = 0,
    ) {
        Logger.info(`GraphQL Query: get transactions. @Query: ${query} @First: ${first} @Offset: ${offset} received.`);
        try{
            let data = await Transaction.find({
                take: first,
                skip: offset,
                order: { executed_on: 'DESC' },
                where: query
            })
            Logger.info("Transaction data retrieved succesfully.");
            return data;
        } catch(err) {
            Logger.error(err);
            return err;
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

生成模式的代码是联合的,如下所示:

import { buildSchemaSync} from 'type-graphql';
import {createResolversMap} from 'type-graphql/dist/utils/createResolversMap';
import {
    TransactionSchema, AccountSchema, RefreshDataSchema
} from '../graphql';
import { printSchema, buildFederatedSchema } from '@apollo/federation';
import { gql } from 'apollo-server-express';

const compiledSchema = buildSchemaSync({
    resolvers: [
        TransactionSchema,
        AccountSchema,
        RefreshDataSchema
    ],
});

export const schema = buildFederatedSchema(
    {
      typeDefs: gql(printSchema(compiledSchema)),
      resolvers: createResolversMap(compiledSchema) as any
    }
  );
Run Code Online (Sandbox Code Playgroud)

当我尝试生成时,我得到的错误是:

Error: Schema must contain uniquely named types but contains multiple types named "DateTime".
Run Code Online (Sandbox Code Playgroud)

不确定它是从哪里得到这个“DateTime”的。

谢谢

Jum*_*ail 7

我知道这篇文章发布已经过去很长时间了。我一直在使用 NestJS + GraphQL + Prisma,并且遇到了同样的问题,但我想发布一些对我有帮助的内容,因为我花了大量时间尝试修复它。

就我而言,删除 /dist 文件夹。如果您想知道到底是什么原因造成的,可以在这里找到


小智 5

如果您使用相同的name.

例如,

const X = new GraphQLObjectType({
   name: 'Hello',
   ...
});

const Y = new GraphQLObjectType({
   name: 'Hello',
   ...
});
Run Code Online (Sandbox Code Playgroud)

无论XY对象类型具有相同的name未在GraphQL不允许的。尝试使用不同的名称。


Dan*_*den 0

这是从解析器类创建类型定义和解析器映射的官方方法:

import { buildTypeDefsAndResolvers } from 'type-graphql';

const { typeDefs, resolvers } = await buildTypeDefsAndResolvers({
  resolvers: [FirstResolver, SecondResolver],
});
Run Code Online (Sandbox Code Playgroud)

这显示在此处的文档中。