既存の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)
}
})
})
ただし、オブジェクト全体を自動的に返す方法はまだわかりません。
2番目のバージョンを実行できますが、NestedObjectTypeの作成やネストされたすべてのプロパティの指定など、多くの追加コードが必要です。
やれ!それは素晴らしいでしょう。それが、GraphQLを最大限に活用するための方法です。
オーバーフェッチの防止の他に、型の検証や、スキーマがデータのより完全な説明を提供するため、コードの可読性と保守性の向上など、他にも多くの利点があります。追加の作業を前もって実行してくれたことに後で感謝します。
なんらかの理由でそのルートをたどらず、結果を完全に理解したくない場合は、ネストされたオブジェクトをJSON.stringify
を使用して文字列としてエンコードできます。
しかし、私が言ったように、私はあなたがしないことをお勧めします!
あなたはスカラーJSON型を使用しようとするかもしれません。あなたはより多くを見つけることができます ここ(apollographqlに基づく) 。
scalar JSON
をスキーマ定義に。{JSON: GraphQLJSON}
解決関数に。
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");