graphsql-組合せCustom Lezoverにコールバックタイプを追加

13582 ワード

graphql-compose
graphql-ノードを合成します.jsで複雑なgraphqlアーキテクチャを構成するのに役立つライブラリです.
シナリオを構成するために、複数のResolverとタイプのシナリオが用意されています.
クストム・リゾフのタイプ
graphql-コンビネーションによって提供されるコールバックタイプではなく、ユーザー自身が構成するコールバックタイプを指定する必要があります.
Custom Lezooverで作成したモデルタイプ情報ではなく、いくつかの情報だけを返す場合は、タイプを指定するのが難しいという欠点があります.typeをJSONに指定すると、グラウンドで目的の情報を取得するのが難しいということです.
これらの欠点を補うために,いくつかの研究を行い,createObjectTC文書により答えを得た.
既存のコード
import { UserProductModel, UserTicketModel } from '~'; // 모델 스키마가 정의되어 있는 파일 루트
import { ProductModelTC } from '~'; // TC 가 정의되어 있는 파일 루트

const name = 'resolverName';

// args에는 해당 리졸버 쿼리를 보낼 때 함께 보내는 argument의 key 네임과 값의 타입을 지정해줍니다.

  ProductModelTC.addResolver({
    args: {
      id: 'String',
    },
    name,
    resolve: async ({ args }: { args: { id?: string } }) => {
      const item = await Model.findOne({
        uid: args.id,
      });

      if (!item) {
        throw new Error('올바르지 않은 상품 정보입니다. 다시 시도해주세요.');
      }

      const userTickets = await UserTicketModel.find({
        parentPackage: userProductPackage._id,
      });
      const userProducts = await UserProductModel.find({
        parentPackage: userProductPackage._id,
      });

      return {
        userPackage: userProductPackage,
        userTickets: userTickets,
        userProducts: userProducts,
      };
    },
    type: 'JSON',
  });
この左輪ピストルは、モデルを介して必要なデータを受信し、修正および加工されたタイプのデータを返します.
最初はタイプ指定ができなかったため、JSONタイプに戻り、グラウンドなどでテストを行った場合、必要なデータだけを受信することができませんでした.
createObjectTCを使用して修正されたコード
import { UserProductModel, UserTicketModel } from '~'; // 모델 스키마가 정의되어 있는 파일 루트
import { ProductModelTC } from '~'; // TC 가 정의되어 있는 파일 루트
import { schemaComposer } from 'graphql-compose';

const name = 'resolverName';

// 리턴될 데이터의 타입을 미리 지정해서, objectTC로 제작합니다. 
// userTickets, userProducts의 경우 단일 데이터가 아닌 배열 데이터로 리턴되어 배열([])로 감싸주었습니다.
// 해당 방식으로 데이터의 타입을 지정해 줄 경우, UserTickets의 _id만 받거나, 원하는 일부 데이터만 받아오는 것이 가능해집니다.
const ReturnType = schemaComposer.createObjectTC({
  name: 'returnType',
  fields: {
    userPackage: 'UserProduct',
    userTickets: '[UserTicket]',
    userProducts: '[UserProduct]',
  },
});

  ProductModelTC.addResolver({
    args: {
      id: 'String',
    },
    name,
    resolve: async ({ args }: { args: { id?: string } }) => {
      const item = await Model.findOne({
        uid: args.id,
      });

      if (!item) {
        throw new Error('올바르지 않은 상품 정보입니다. 다시 시도해주세요.');
      }

      const userTickets = await UserTicketModel.find({
        parentPackage: userProductPackage._id,
      });
      const userProducts = await UserProductModel.find({
        parentPackage: userProductPackage._id,
      });

      return {
        userPackage: userProductPackage,
        userTickets: userTickets,
        userProducts: userProducts,
      };
    },
    type: ReturnType,
  });
createObjectTCによって返される値のパターンが作成され、タイプのパターンが作成されます.
タイプがJSONに指定されている場合とは異なり、queryに返されるデータの一部のみを受信できます.