首页 > 解决方案 > 不能对 Type-GraphQL 字段类型使用类型“对象”

问题描述

我想为我的 NestJs API 创建一个 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();
  }

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

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

当更改类型时,例如string启动时不会抛出错误。问题是我无法指定显式类型,因为我的 MongoDB 存储持有“任何东西”的对象。

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


编辑:

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

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

我收到这个错误

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

标签: graphqlnestjstypegraphql

解决方案


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

import { GraphQLJSONObject } from 'graphql-type-json'

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

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

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


推荐阅读