сущности type-graphql как опустить поля из JSON .stringify? - PullRequest
1 голос
/ 17 января 2020

Мы используем https://github.com/MichalLytek/type-graphql для определения нашей схемы graphql Когда мы сериализуем необработанный объектный объект машинописного текста, это не учитывает различные аннотации полей в наших объектах GQL и приводит к утечке нежелательных данных. Пример ниже класса сущности профиля

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
}

account содержит конфиденциальные данные. Когда мы JSON.stringify ссылка на профиль, мы не хотим вывода учетной записи. Учетная запись не помечена @Field, и мы ожидаем, что она не будет выводиться.

1 Ответ

1 голос
/ 18 января 2020

Декораторы, используемые type-graphql, существуют только для указания type-graphql, как преобразовать ваш класс в тип GraphQL - они не будут каким-то образом влиять на то, как экземпляр класса сериализуется встроенной функцией, такой как * 1003. *.

В контексте вашей схемы account никогда не будет возвращено в ответе, если вы явно не создадите для него поле, даже если экземпляр Profile, используемый вашими преобразователями, имеет это свойство. Это признак того, как разрешение полей работает в GraphQL. js. Однако экземпляр Profile всегда будет иметь свойство account, потому что это то, что вы определили как часть вашего класса.

Из вашего вопроса неясно, почему вы вызываете stringify в Во-первых, но при условии, что он будет использоваться в каком-то другом контексте, например, при ведении журнала, вы захотите предоставить свой собственный метод для сериализации экземпляра, который ограничивает возвращаемые свойства. Это можно легко сделать, используя что-то вроде lodash pick или omit.

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