繁体   English   中英

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

[英]can't use type 'object' for Type-GraphQL field types

我想为我的 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 输出类型

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

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

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

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

或者您可以将装饰器保留为@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 获取完整的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM