Typescript 实施';命名空间类型化';NestJS和x2B中的解析器;图形ql
我偶然发现了一种在自己的“名称空间”下实现GraphQL变体的方法,以帮助保持全局名称空间整洁。Apollo的常规实现类似于此Typescript 实施';命名空间类型化';NestJS和x2B中的解析器;图形ql,typescript,graphql,nestjs,apollo-server,Typescript,Graphql,Nestjs,Apollo Server,我偶然发现了一种在自己的“名称空间”下实现GraphQL变体的方法,以帮助保持全局名称空间整洁。Apollo的常规实现类似于此 const typeDefs = gql` type Mutation { article: ArticleMutations } type ArticleMutations { like: Boolean unlike: Boolean } `; const resolvers = { Mutation: { art
const typeDefs = gql`
type Mutation {
article: ArticleMutations
}
type ArticleMutations {
like: Boolean
unlike: Boolean
}
`;
const resolvers = {
Mutation: {
article: () => ({}), // ✨✨✨ magic! which allows to proceed call of sub-methods
}
ArticleMutations: {
like: () => { /* resolver code */ },
unlike: () => { /* resolver code */ },
},
};
我决定尝试在用NestJS构建的GraphQLAPI中实现这个模式,但是我似乎遇到了一个绊脚石。我创建了一个TestResolver
类,它包含一个简单的查询,以及一个名称空间的变体,该变体应该返回嵌套的解析器
@ObjectType()
export class TestMutations {
constructor(private readonly _testService: TestService) {}
@Field(() => String)
test: string;
@ResolveField(() => Unit, {})
async create(@Args('input') input: CreateTestInput): Promise<Test> {
try {
return await this._testService.create(input);
} catch (err) {
this._logger.error(err);
throw new HttpException('An error occurred when creating the Test', HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
@Resolver(() => Test)
export class TestResolver {
constructor(private readonly _testService: UnitService) {}
@Query(() => Test, { name: 'test', nullable: true })
async getTest(@Args('id') id: Id): Promise<Test> {
try {
return await this._testService.get(id);
} catch (err) {
this._logger.error(err);
throw new HttpException('An error occurred when fetching the Test', HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@Mutation(() => TestMutations)
test(): TestMutations {
return new TestMutations(this._testService);
}
}
@ObjectType()
导出类测试{
构造函数(私有只读_testService:testService){}
@字段(()=>字符串)
测试:字符串;
@ResolveField(()=>单位,{})
异步创建(@Args('input')输入:CreateTestInput):承诺{
试一试{
返回等待此操作。_testService.create(输入);
}捕捉(错误){
此错误(err);
抛出新的HttpException(“创建测试时出错”,HttpStatus.INTERNAL\u SERVER\u错误);
}
}
}
@分解器(()=>测试)
导出类TestResolver{
构造函数(私有只读_testService:UnitService){}
@查询(()=>Test,{name:'Test',null:true})
异步getTest(@Args('id')id:id):承诺{
试一试{
返回等待此消息。\u testService.get(id);
}捕捉(错误){
此错误(err);
抛出新的HttpException('获取测试时出错',HttpStatus.INTERNAL\u SERVER\u错误);
}
}
@突变(()=>测试突变)
test():test{
返回新的TestMutations(this.\u testService);
}
}
通过一些尝试和错误,我成功地让NestJs构建了上述代码,但是我无法让嵌套的FieldResolver
s显示出来
这个模式的简单Apollo实现看起来确实使用了一些“神奇”的代码来实现它,所以NestJS的结构肯定不允许我这样做。有人有什么想法吗?你也可以用Nest.js来实现。我是如何做到的:
@Resolver('root'))
导出类根解析器{
@查询((返回)=>KBQuery,{name:'kb'})
kbQuery(){
返回新的KBQuery();
}
@Query((returns)=>UserQuery,{name:'user'})//这里可以是@Mutation
用户查询(){
返回新的UserQuery();
}
//…此处还有其他根查询和变异
}