gpt4 book ai didi

typescript - 在 NestJS + GraphQL 中实现 'Namespace-Typed' 解析器

转载 作者:行者123 更新时间:2023-12-05 04:58:43 25 4
gpt4 key购买 nike

我偶然发现了一个 interesting pattern在他们自己的“命名空间”下实现 GraphQL Mutations,以帮助保持全局命名空间整洁。使用 Apollo 的常规实现看起来像这样。

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 构建的 GraphQL API 中实现此模式,但我似乎遇到了绊脚石。我创建了一个 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);
}
}

通过反复试验,我设法让 NestJs 成功构建了上述代码,但是我无法让嵌套的 FieldResolver 显示出来。

enter image description here

此模式的普通 Apollo 实现确实似乎使用了一些“魔术”代码来实现它,因此 NestJS 的结构绝对有可能不允许我做这样的事情。有人有什么想法吗?

最佳答案

您也可以使用 Nest.js 做到这一点。这是我如何做到的:

  1. 我创建了根解析器。

@Resolver('root')
export class RootResolver {
@Query((returns) => KBQuery, { name: 'kb' })
kbQuery() {
return new KBQuery();
}

@Query((returns) => UserQuery, { name: 'user' }) // Here can be @Mutation
userQuery() {
return new UserQuery();
}
// ... Other root Queries and Mutations here
}

  1. 然后我像这样创建子解析器(用于查询或突变):

@ObjectType()
export class UserQuery {}

@Resolver((of) => UserQuery)
export class UserQueryResolver {
@ResolveField((returns) => UserMyPayload)
async me(@Context('req') { currentUser }: Request) {
if (!currentUser) return { error: new ApiError('unauthorized', 'Authorization required') };

return { user: currentUser.user };
}
}

  1. 所以现在我可以像这样查询:user.me 以获取用户详细信息。

我希望使用 Nest.js 会更容易。所以来自 Nest 的人需要在@Query/@Mutation 属性中添加一些东西。

关于typescript - 在 NestJS + GraphQL 中实现 'Namespace-Typed' 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63849094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com