node.js - type-graphql-entiteter hur man utelämnar fält från JSON.stringify?
Vi använder https://github.com/MichalLytek/type-graphql för att definiera vårt GraphQL-schema. När vi serialiserar det råa TypeScript-entityobjektet respekterar detta inte de olika fältannoteringarna i våra GQL-entitys och leder till att oönskad data läcker ut. Exempel nedan en Profile-entityklass
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 har känslig data. När vi JSON.stringify en Profil-referens vill vi inte att account ska genereras. Account är inte annoterad med @Field och vi förväntar oss att det inte ska genereras.
Svar #1
Dekoratörerna som används av type-graphql finns endast för att instruera type-graphql hur din klass ska översättas till en GraphQL-typ -- de kommer på inget sätt att påverka hur en instans av klassen serialiseras av en inbyggd funktion som JSON.stringify.
I samband med ditt schema kommer account aldrig att returneras i svaret om du inte uttryckligen skapar ett fält för det, även om Profile-instansen som används av dina resolvers har den egenskapen. Detta är ett symptom på hur fältupplösning fungerar i GraphQL.js. Däremot kommer en Profile-instans alltid att ha en account-egenskap eftersom det är det du har definierat som en del av din klass.
Det är oklart från din fråga varför du anropar stringify från första början, men om vi antar att det är för att använda i något annat sammanhang, som loggning, då vill du exponera din egen metod för att serialisera instansen som begränsar vilka egenskaper som returneras. Detta kan enkelt göras med något som lodash's pick eller omit.
serialize () {
return _.omit(this, ['account'])
}
