node.js - type-graphql 实体如何省略 JSON.stringify 中的字段?

标签 node.js typescript graphql apollo-server

我们正在使用https://github.com/MichalLytek/type-graphql定义我们的 graphql 架构 当我们序列化原始 TypeScript 实体对象时,这不尊重 GQL 实体中的各种字段注释,最终会泄漏不需要的数据。下面是 Profile 实体类的示例

import { Field, Int, ObjectType } from 'type-graphql'
import { Column, Entity, ManyToOne, OneToMany } from 'typeorm'
import { Account } from '../account/account.entity'

export class Profile {
  @Field()
  @Column({ unique: true })
  public username: string

  @Field()
  @Column()
  public name: string

  // Relations

  @Column()
  public accountId: string

  @ManyToOne(type => Account, account => account.profiles, { eager: true })
  public account: Account
}

帐户包含敏感数据。当我们JSON.stringify配置文件引用时,我们不需要帐户输出。帐户未使用 @Field 进行注释,我们预计它不会被输出。

最佳答案

type-graphql 使用的装饰器仅用于指示 type-graphql 如何将您的类转换为 GraphQL 类型——它们不会以某种方式影响类的实例如何通过 JSON.stringify 等 native 函数进行序列化。

在您的架构上下文中,account 永远不会在响应中返回,除非您明确为其创建一个字段,即使您的解析器使用的 Profile 实例具有该属性。这是 GraphQL.js 中字段解析工作原理的一个症状。但是,Profile 实例始终具有 account 属性,因为这是您在类中定义的属性。

从你的问题中不清楚为什么你首先调用 stringify ,但假设它是在其他上下文中使用的,比如日志记录,那么你需要公开你自己的方法来序列化限制返回哪些属性的实例。使用 lodashpickomit 等工具可以轻松完成此操作。

serialize () {
  return _.omit(this, ['account'])
}

关于node.js - type-graphql 实体如何省略 JSON.stringify 中的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59793732/

相关文章:

javascript - 如何在具有默认导出的 TypeScript 类型中描述 JavaScript 类静态工厂方法?

node.js - 剧作家测试运行失败

node.js - 异步函数discord.js 中的awaitMessages

javascript - 将 Node.js/Socket.io 放到网站上

javascript - 语法错误: Unexpected token o in JSON at position 1 EXPRESS

javascript - 如何管理 GraphQL 查询循环?

redux - 管理 Redux 和 Apollo 的商店

node.js - 罗博蒙戈 : Doesn't display all documents

reactjs - 强类型 useDynamicCallback

sequelize.js - graphQL 查询给我空对象作为响应