不能对 Type-GraphQL 字段类型使用类型“对象”

hrp*_*xQ4 3 graphql nestjs typegraphql

我想为我的 NestJs API 创建一个 GraphQL 层。所以基于这个接口持有一个键/值对

export interface Mapping {
  id: string;
  value: object;
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个 DTO 作为 GraphQL 查询的返回类型

@ObjectType()
export class MappingDTO {
  @Field(() => ID)
  id: string;

  @Field()
  value: object;
}
Run Code Online (Sandbox Code Playgroud)

所以当我想找到所有映射时,我会想出这个

  @Query(() => [MappingDTO])
  public async mappings(): Promise<Mapping[]> {
    return this.mappingsService.getMappings();
  }
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不能object用于 value 字段。我收到这个错误

NoExplicitTypeError: 您需要为 MappingDTO#value 提供显式类型!

当改变类型时,例如string在启动时没有错误被抛出。问题是我无法指定显式类型,因为我的 MongoDB 存储了包含“任何东西”的对象。

如何修复解析器或 DTO 以处理对象类型?


编辑:

解析器装饰器也是如此。当我有这个

  @Query(() => Object)
  public async getValueByKey(@Args('id') id: string): Promise<object> {
    return this.mappingsService.getValueByKey(id);
  }
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

错误:无法确定 getValueByKey 的 GraphQL 输出类型

Dan*_*den 7

听起来您应该使用自定义 JSON 标量。像这个

import { GraphQLJSONObject } from 'graphql-type-json'
Run Code Online (Sandbox Code Playgroud)

然后可以直接在字段装饰器中使用:

@Field(() => GraphQLJSONObject)
value: object
Run Code Online (Sandbox Code Playgroud)

或者您可以将装饰器保留为@Field()并将适当的添加scalarsMap到您传递给的选项中buildSchema。有关其他详细信息,请参阅文档