Я работаю над микросервисным приложением. У меня есть одна служба Node.js, которая действует как «служба данных» и запускает nestjs
с typeorm
и type-graphql
моделями. Служба данных использует модуль https://github.com/nestjs/graphql для включения интерфейса Graphql и игровой площадки.
У меня есть вторая служба, которая представляет собой «службу веб-сокетов», на которую подписываются и клиенты.
«Служба данных» отправляет HTTP-запросы «службе веб-сокетов», используя библиотеку axios
, которые затем отправляются клиентам через веб-сокет. Сообщения, отправляемые из «службы данных» в «службу сокетов», включают модели typeorm
. При отправке через топор ios typeorm
модели проходят через JSON.stringify
. В этом заключается проблема. Это преобразование stringify
включает в себя поля, которые не должны быть в конечном выводе, а также пропускают метаданные схемы graphql.
Вместо того, чтобы приводить в соответствие модели, я хотел бы преобразовать их в полезную нагрузку graphql, аналогичную той, что используется в GraphQl. возвращается. Из того, что я могу сказать, это преобразование graphql глубоко абстрагировано и происходит где-то внутри модуля nest/graphql
, который абстрагирует модуль apollo/server
.
Это сложная система, из которой трудно извлечь отдельные примеры кода. , Оставьте комментарий, если что-то нужно уточнить. Ниже приведен пример использования службы данных: у нас есть объект Profile
, который имеет profile.entity.ts
profile.service.ts
и profile.resolver.ts
Объект Profile
выглядит как
import { Field, Int, ObjectType } from 'type-graphql'
import { Column, Entity, ManyToOne, OneToMany } from 'typeorm'
import { BaseEntity } from '../common/base/base.entity'
@ObjectType()
@Entity()
export class Profile extends BaseEntity {
@Field()
@Column({ unique: true })
public username: string
@Field()
@Column()
public name: string
@Field({ nullable: true })
@Column({ nullable: true })
public birthday?: Date
// Relations
@Column()
public accountId: string
@ManyToOne(type => Account, account => account.profiles, { eager: true })
public account: Account
}
Ссылка Profile
извлекается и отправляется службе сокетов, например
const profileReference = await this.profileService.fetchById(profileId)
await this.socketService.sendHomeEvent(profileReference)
. Здесь мы хотели бы взять profileReference
и сериализовать его в полезную нагрузку ответа graphql. Результат JSON.stringify
для profileReference
включает поля, в частности поле Account
, которые не должны быть включены.