2017-08-03 10 views
1

私はApolloのgraphql-toolsを使ってgraphqlサーバを単純化しようとしています。レイジーフェッチをしたいのですが、リゾルバとしてjavascriptクラスを使用するときにできることを約束することはできません。graphql-tools:遅延フェッチ?

は、ここで私が得たものです:

スキーマ

type Customer { 
    details: Contact! 
    addresses: [Address]! 
} 
    extend type Query { 
     customers(first: Int = 0, next: Int = 50): [Customer] 
     customer(id: Int!): Customer 
    } 

はリゾルバ

const domain1Resolvers = { 
    Query: { 
     customers: (_, { 
      first, 
      next 
     }) => customers(first, next) 
    } 
}; 

方法解決:

const customers = (first, next) => { 
    return new Promise(resolve => { 
     var q = 
      ` 
       SELECT *, company as organization FROM customer 
       ORDER BY id DESC 
       LIMIT ?, ?`; 
     sql.query(q, [first, next], function(err, rows) { 
      if (err) { 
       throw Error(err); 
      } 
      resolve(rows.map(r => { 
       return { 
        details: r, 
        addresses:() => getAddresses(r.id), 
       } 
      })); 
     }); 
    }) 
}; 

方法getAddressesは、アドレスがのrequ場合にのみ呼び出されますested。クラスベースのアプローチでは、私はgetAddressesがPromiseを返すようにすることができますが、このメカニズムを使用してIterableを試みるとIterableを返さないことについては不平を言います。要求されたときにのみアドレスを取得する方法がいくつか存在するに違いありませんが、空白を描き、今のところ見つからない例があります。

答えて

2

お客様が要求されたときにのみフィールドを解決するには、customersクエリのリゾルバではなく、特定のフィールドにリゾルバを使用することをお勧めします。

const domain1Resolvers = { 
    Query: { 
    customers: (_, { 
     first, 
     next 
    }) => customers(first, next) 
    }, 
    Customer: { 
    addresses: ({ details: { id } }) => getAddresses(id) 
    }, 
}; 
+0

ブリリアント:あなたのリゾルバは次のようになります!ありがとうございました。私はそんなことは何も経験していなかった。 –