Как преобразовать модель `typeorm` в полезную нагрузку graphql? - PullRequest
0 голосов
/ 20 января 2020

Я работаю над микросервисным приложением. У меня есть одна служба 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, которые не должны быть включены.

1 Ответ

0 голосов
/ 23 января 2020

Учитывая схему GraphQL, вы можете выполнить любой произвольный запрос на стороне сервера. type-graphql предоставляет buildSchema для построения вашей схемы из классов резолвера, как показано здесь .

import { buildSchema } from 'type-graphql'
import { graphql } from 'graphql'

const schema = await buildSchema({
  resolvers: [ProfileResolver],
})
const query = `
  # your query here
`
const root = {}
const context = {...}
const variables = {...}
const { data, errors } = await graphql(schema, query, root, context, variables)

К сожалению, я не думаю, гнездо. js раскрывает схему, которую он строит под капотом, так что вам придется сделать это самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...