【问题标题】:Error: Schema must contain uniquely named types but contains multiple types named "DateTime"错误:架构必须包含唯一命名的类型,但包含多个名为“DateTime”的类型
【发布时间】:2020-06-28 08:28:19
【问题描述】:

我正在尝试生成 GraphQL 架构。

我有以下解析器。其中 3 个位于不同的文件中。其中 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;
        }

    }

}

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

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
    }
  );

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

Error: Schema must contain uniquely named types but contains multiple types named "DateTime".

不确定它是从哪里得到这个“日期时间”的。

谢谢

【问题讨论】:

    标签: node.js graphql-js typegraphql


    【解决方案1】:

    你同样可以提供一个带有 __dirname 的文件夹

    【讨论】:

      【解决方案2】:

      如果您使用相同的name 命名了两个或多个对象类型,通常会发生此错误。

      例如,

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

      XY 对象类型都具有相同的 name,这在 GraphQL 中是不允许的。 尝试使用不同的名称。

      【讨论】:

      • 欢迎来到 Stack Overflow。我已经编辑了您的答案以改进格式。请查看编辑,以便在您提供未来的答案时,您知道如何格式化您的代码以提高可读性。有关 Stack Overflow 格式的更多信息,请参阅Markdown help
      • 我不认为这是个问题。因为假设架构中可以有很多 ``name` ``` input GitConfigure2FAInput { provider: GitProvider!令牌:字符串! remoteRepositoryUrl:字符串! } 输入 GitConfigureInput { 提供者:GitProvider!用户名:字符串!密码:字符串! remoteRepositoryUrl:字符串! } ```
      【解决方案3】:

      Type-Graphql 存在问题。尝试使用“type-graphql”:“^0.18.0-beta.10”。

      【讨论】:

        【解决方案4】:

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

        import { buildTypeDefsAndResolvers } from 'type-graphql';
        
        const { typeDefs, resolvers } = await buildTypeDefsAndResolvers({
          resolvers: [FirstResolver, SecondResolver],
        });
        

        这显示在文档here 中。

        【讨论】:

          猜你喜欢
          • 2023-01-01
          • 2019-04-19
          • 2022-12-22
          • 2021-08-24
          • 2021-05-08
          • 2019-03-26
          • 2021-09-08
          • 2019-02-06
          • 1970-01-01
          相关资源
          最近更新 更多