can';t使用类型';对象';对于类型GraphQL字段类型

can';t使用类型';对象';对于类型GraphQL字段类型,graphql,nestjs,typegraphql,Graphql,Nestjs,Typegraphql,我想为我的NestJSAPI创建一个GraphQL层。因此,基于这个持有键/值对的接口 export interface Mapping { id: string; value: object; } 我创建了一个DTO作为GraphQL查询的返回类型 @ObjectType() export class MappingDTO { @Field(() => ID) id: string; @Field() value: object; } 所以当我想找到所有的映

我想为我的NestJSAPI创建一个GraphQL层。因此,基于这个持有键/值对的接口

export interface Mapping {
  id: string;
  value: object;
}
我创建了一个DTO作为GraphQL查询的返回类型

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

  @Field()
  value: object;
}
所以当我想找到所有的映射时,我会想到这个

  @Query(() => [MappingDTO])
  public async mappings(): Promise<Mapping[]> {
    return this.mappingsService.getMappings();
  }
我得到这个错误

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


听起来您应该使用自定义JSON标量。喜欢

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

@Field(() => GraphQLJSONObject)
value: object

或者,您可以将decorator保留为
@Field()
,并将相应的
scalarsMap
添加到传递给
buildSchema
的选项中。有关更多详细信息,请参阅。

只是为了指出一个事实,即GraphQL的整个思想是声明性数据获取。 此外,您还可以在GraphQL中定义自定义类型标量类型没有对象作为选项,但您可以这样定义自己的类型

type customObject {
      keyOne: Int!
      KeyTwo: String!
      ...
      key(n): ...
}
并在接口、查询、转换中使用此类型:

export interface Mapping {
      id: string;
      value: customObject;
}

您可能会认为,您必须在这个类型的customObject中定义存储在mongoDB中的对象的每个键,但您不必这样做。这就是GraphQL声明性数据获取的用武之地。您只需在前端使用的类型(customObject)中定义这些字段,无需从DB获取完整的对象。

祝福您@daniel rearden!
type customObject {
      keyOne: Int!
      KeyTwo: String!
      ...
      key(n): ...
}
export interface Mapping {
      id: string;
      value: customObject;
}