2017-07-29 7 views
2

私は新しいフルスタックプロジェクトにGraphQLを採用しています。すでに多くの概念を研究しており、最初のプロジェクトを開始しました。宣言とプログラムによるGraphQL

私の質問は、宣言型とプログラム的にGraphQLスキーマ定義を使用することに関連しています。基本的に私はGraphQL official siteで見ることができるすべては、宣言的なアプローチを使用しています。でも、何とか複雑なデータ構造のため

type Brand { 
    name: String 
    logoUrl: String 
} 
enum Gender { 
    MALE 
    FEMALE 
} 
type Image { 
    thumbnailUrl: String 
    smallUrl: String 
    mediumUrl: String 
    largeUrl: String 
} 
type Article { 
    id: ID! # non-nullable, is guaranteed to exist on every article 
    name: String 
    thumbnailUrl: String 
    brand: Brand 
    genders: [Gender] 
    images: [Image] 
    recommendations: [Article] 
} 
type Query { 
    Article(id: ID!): Article 
    Articles: [Articles] 
} 

非常にきれいで、簡潔なコード:あなたは(this example hereのおかげで)のような、1つまたは複数のファイルにスキーマを定義します。

しかし、私はウェブ上でもI'veのようなもの、プログラム的にスキーマを構築するためのアプローチを使用研究本に見る例のほとんど:私の目標は、大規模なSaaSアプリケーションを構築することです

import { GraphQLObjectType, GraphQLInputObjectType } from 'graphql'; 
import {GraphQLNonNull, GraphQLID, GraphQLList } from 'graphql'; 
import { GraphQLString, GraphQLInt, GraphQLBoolean } from 'graphql'; 

import { UserType } from '../User/types'; 
import UserModel from '../../../models/User'; 

const fields = { 
    _id: { 
     type: new GraphQLNonNull(GraphQLID) 
    }, 
    name: { 
     type: GraphQLString 
    }, 
    phone: { 
     type: GraphQLString 
    } 
}; 

const CompanyType = new GraphQLObjectType({ 
    name: 'Company', 
    description: 'Company', 
    fields: fields 
}) 


const Company = { 
    type: CompanyType, 
    description: 'Get single company', 
    args: { 
     id: { 
      name: 'id', 
      type: new GraphQLNonNull(GraphQLID) 
     } 
    }, 
    resolve(root, params) { 

     params.deleted = false; 

     return CompanyModel.find(params).exec(); 
    } 
} 

const Companies = { 
    type: new GraphQLList(CompanyType), 
    description: 'Get all companies', 
    resolve(root) { 
     const companies = CompanyModel.find({ deleted: false }).exec(); 
     if (!companies) { 
      throw new Error('Error getting companies.') 
     } 
     return companies; 
    } 
} 

export default { 
    Company, 
    Companies 
} 

、スキーマはかなり複雑になり、私の心配はコードがかなりすぐに複雑になるということです。

したがって、宣言的アプローチ、プログラム的アプローチ、または2つの組み合わせが必要ですか?

ここでのベストプラクティスは何ですか?

答えて

2

このトピックについては、herehereというディスカッションがあります。

IMHO、GraphQLスキーマ言語でスキーマを定義する最大の利点は読みやすさです。これにより、スキーマを読みやすく理解しやすくなります。特に、エンドポイントを照会している可能性があるが実際にそのデザインに関与していない内部ユーザーにとっては、私はそれがスキーマの定義と変更をエラーを起こしにくいものにしていると思います。

一方、スキーマをプログラムで定義すると、柔軟性が大幅に向上します。たとえば、buildSchemaを使用する場合は、クエリと突然変異のみのリゾルバを渡すことに限定されます。これは、デフォルトのリゾルバを利用するだけで、すべてのタイプでOKなら、うまく動作しますが、個々のフィールドのリゾルバを定義する必要がある場合はどうなりますか?

スキーマをプログラムで定義すると、指定したタイプの中の個々のフィールドのリゾルバを定義できます。これは、データベースから戻ってくるデータを変換するだけでなく(thumbanail_urlthumbnailUrlフィールドに変換します)、これらのフィールドに追加のデータベースクエリが必要な場合は、フィールドが実際に要求されない限り、パフォーマンスが大幅に向上します。ドキュメントが指摘しているように、スキーマを自動的に生成したい場合は、この方法も便利です。

これは私がgraphql-toolsmakeExecutableSchemaを個人的に愛する理由です。これは中間的なアプローチのようなもので、タイプをきれいに(GraphQLスキーマ言語を使用して)定義することができ、リゾルバを実装する際に柔軟性を持たせることができます。

関連する問題