web-dev-qa-db-ja.com

GraphQL-ネストされたJSONオブジェクトからすべてのフィールドを取得する

既存のREST APIで説明されているように、GraphQLラッパーを 分でGraphQLにゼロ に置きます)。ネストされたオブジェクトを指すプロパティ:

// API Response
{
  entity_id: 1,
  nested_object: {
    key1: val1,
    key2: val2,
    ...
  }
}

ネストされたオブジェクトとそのすべてのプロパティを明示的に定義せずに、このネストされたオブジェクト全体を取得できるようにスキーマを定義することは可能ですか?ネストされたオブジェクトが必要であることをクエリで指定し、ネストされたオブジェクトから必要なすべてのプロパティを指定する必要はありません。

// What I want
{
  product(id: "1") {
    entityId
    nestedObject
  }
}

// What I don't want
{
  product(id: "1") {
    entityId
    nestedObject {
      key1
      key2
      ...
    }
  }
}

2番目のバージョンも実行できますが、NestedObjectTypeの作成やネストされたすべてのプロパティの指定など、多くの追加コードが必要です。次のように、すべてのキーのリストを自動的に取得する方法もわかりました。

const ProductType = new GraphQLObjectType({
  ...

  fields: () => ({
    nestedObject: {
      type: new GraphQLList(GraphQLString),
      resolve: product => Object.keys(product.nested_object)
    }
  })
})

ただし、オブジェクト全体を自動的に返す方法はまだわかりません。

13
collinksmith

2番目のバージョンを実行できますが、NestedObjectTypeの作成やネストされたすべてのプロパティの指定など、多くの追加コードが必要です。

やれ!それは素晴らしいでしょう。それが、GraphQLを最大限に活用するための方法です。

オーバーフェッチの防止の他に、型の検証や、スキーマがデータのより完全な説明を提供するため、コードの可読性と保守性の向上など、他にも多くの利点があります。追加の作業を前もって実行してくれたことに後で感謝します。

なんらかの理由でそのルートをたどらず、結果を完全に理解したくない場合は、ネストされたオブジェクトをJSON.stringifyを使用して文字列としてエンコードできます。

しかし、私が言ったように、私はあなたがしないことをお勧めします!

5
Eric Streeper

あなたはスカラーJSON型を使用しようとするかもしれません。あなたはより多くを見つけることができます ここ(apollographqlに基づく)

  • 追加 scalar JSONをスキーマ定義に。
  • 追加 {JSON: GraphQLJSON}解決関数に。
  • shemaでJSON型を使用します。

    scalar JSON
    type Query {
        getObject: JSON
    }

  • クエリの例:

    query {
      getObject
    }

  • 結果:

    {
      "data": {
        "getObject": {
          "key1": "value1",
          "key2": "value2",
          "key3": "value3"
        }
      }
    }

基本コード:


    const express = require("express");
    const graphqlHTTP = require("express-graphql");
    const { buildSchema } = require("graphql");
    const GraphQLJSON = require("graphql-type-json");

    const schema = buildSchema(`
      scalar JSON

      type Query {
        getObject: JSON
      }
    `);

    const root = {
      JSON: GraphQLJSON,

      getObject: () => {
        return {
          key1: "value1",
          key2: "value2",
          key3: "value3"
        };
      }
    };

    const app = express();
    app.use(
      "/graphql",
      graphqlHTTP({
        schema: schema,
        rootValue: root,
        graphiql: true
      })
    );
    app.listen(4000);
    console.log("Running a GraphQL API server at localhost:4000/graphql");

0