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”的。
谢谢
小智 5
如果您使用相同的name.
例如,
const X = new GraphQLObjectType({
name: 'Hello',
...
});
const Y = new GraphQLObjectType({
name: 'Hello',
...
});
Run Code Online (Sandbox Code Playgroud)
无论X和Y对象类型具有相同的name未在GraphQL不允许的。尝试使用不同的名称。
这是从解析器类创建类型定义和解析器映射的官方方法:
import { buildTypeDefsAndResolvers } from 'type-graphql';
const { typeDefs, resolvers } = await buildTypeDefsAndResolvers({
resolvers: [FirstResolver, SecondResolver],
});
Run Code Online (Sandbox Code Playgroud)
这显示在此处的文档中。
| 归档时间: |
|
| 查看次数: |
4415 次 |
| 最近记录: |