2016-02-25 8 views
7

GraphQLを使用して、約15種類のREST呼び出しから作成されるオブジェクトをクエリしています。これは私がクエリからIDで渡す私のルートクエリです。これは正常に解決する主な生徒のオブジェクトでうまく動作します。しかし、IDをアドレスリゾルバに渡す方法を理解する必要があります。私はアドレスオブジェクトにargsを追加しようとしましたが、argsがStudentオブジェクトから渡されないことを示すエラーが発生します。だから私の質問は:どのように引数をクライアントのクエリからGraphQLサーバー内のサブオブジェクトに渡すのですか?GraphQL:どのようにサブオブジェクトにargsを渡しますか

let rootQuery = new GraphQLObjectType({ 
    name: 'Query', 
    description: `The root query`, 
    fields:() => ({ 
     Student : { 
      type: Student , 
      args: { 
       id: { 
        name: 'id', 
        type: new GraphQLNonNull(GraphQLString) 
       } 
      }, 
      resolve: (obj, args, ast) => { 
       return Resolver(args.id).Student(); 
      } 
     } 
    }) 
}); 

export default rootQuery; 

これは私が他のオブジェクトをリンクする主要な学生オブジェクトです。この場合、私はADDRESSオブジェクトを添付しています。ここで

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

import Resolver from '../../resolver.js' 
import iAddressType from './address.js' 

let Student = new GraphQLObjectType({ 
    name: 'STUDENT', 
    fields:() => ({ 
     SCHOOLCODE: { type: GraphQLString }, 
     LASTNAME: { type: GraphQLString }, 
     ACCOUNTID: { type: GraphQLInt }, 
     ALIENIDNUMBER: { type: GraphQLInt }, 
     MIDDLEINITIAL: { type: GraphQLString }, 
     DATELASTCHANGED: { type: GraphQLString }, 
     ENROLLDATE: { type: GraphQLString }, 
     FIRSTNAME: { type: GraphQLString }, 
     DRIVERSLICENSESTATE: { type: GraphQLString }, 
     ENROLLMENTSOURCE: { type: GraphQLString }, 
     ADDRESSES: { 
      type: new GraphQLList(Address), 
      resolve(obj, args, ast){ 
       return Resolver(args.id).Address(); 
     }} 
    }) 
}); 

が第二REST呼び出しによって解決された私のアドレスオブジェクトです:

let Address = new GraphQLObjectType({ 
    name: 'ADDRESS', 
    fields:() => ({ 
     ACTIVE: { type: GraphQLString }, 
     ADDRESS1: { type: GraphQLString }, 
     ADDRESS2: { type: GraphQLString }, 
     ADDRESS3: { type: GraphQLString }, 
     CAMPAIGN: { type: GraphQLString }, 
     CITY: { type: GraphQLString }, 
     STATE: { type: GraphQLString }, 
     STATUS: { type: GraphQLString }, 
     TIMECREATED: { type: GraphQLString }, 
     TYPE: { type: GraphQLString }, 
     ZIP: { type: GraphQLString }, 
    }) 

}); 

export default Address; 

これらはADDRESSESに渡さ

var Resolver = (id) => { 

    var options = { 
     hostname: "myhostname", 
     port: 4000 
    }; 


    var GetPromise = (options, id, path) => { 
     return new Promise((resolve, reject) => { 
      http.get(options, (response) => { 
       var completeResponse = ''; 
       response.on('data', (chunk) => { 
        completeResponse += chunk; 
       }); 
       response.on('end',() => { 
        parser.parseString(completeResponse, (err, result) => { 
         let pathElements = path.split('.');      
         resolve(result[pathElements[0]][pathElements[1]]); 
        }); 
       }); 
      }).on('error', (e) => { }); 
     }); 
    }; 

    let Student=() => { 
     options.path = '/Student/' + id; 
     return GetPromise(options, id, 'GetStudentResult.StudentINFO'); 
    } 

    let Address=() => { 
     options.path = '/Address/' + id + '/All'; 
     return GetPromise(options, id, 'getAddressResult.ADDRESS'); 
    }; 


    return { 
     Student, 
     Address 
    }; 
} 

export default Resolver; 
+0

FallFast:解決策を見つけました – Brune

+0

これには良い解決策がありましたか? – James111

答えて

1
ADDRESSES: { 
    type: new GraphQLList(Address), 
    resolve(obj, args, ast){ 
     return Resolver(args.id).Address(); 
    } 
} 

引数が渡された引数です私のリゾルバですクエリ時にADDRESSESフィールド。解決方法では、objが生徒オブジェクトである必要があり、idプロパティがある場合は、return Resolver(obj.id).Address();の処理が必要です。

関連する問題