2016-02-25 10 views
7

Tôi đang sử dụng GraphQL để truy vấn một đối tượng sẽ được tạo thành từ khoảng 15 lệnh REST khác nhau. Đây là truy vấn gốc của tôi mà tôi chuyển vào trong ID từ truy vấn. Điều này làm việc tốt cho đối tượng sinh viên chính giải quyết chính xác. Tuy nhiên, tôi cần tìm ra cách chuyển ID xuống đến trình phân giải địa chỉ. Tôi đã thử thêm args vào đối tượng địa chỉ nhưng tôi nhận được một lỗi chỉ ra rằng args không được truyền xuống từ đối tượng Student. Vì vậy, câu hỏi của tôi là: Làm thế nào để vượt qua các đối số từ truy vấn khách hàng đến các đối tượng phụ trong một máy chủ GraphQL?GraphQL: Làm thế nào để bạn chuyển args tới các đối tượng phụ

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; 

Đây là đối tượng học sinh chính của tôi mà tôi liên kết các đối tượng khác. Trong trường hợp này tôi đã gắn đối tượng 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(); 
     }} 
    }) 
}); 

Đây là đối tượng địa chỉ của tôi được giải quyết bằng một cuộc gọi REST thứ hai:

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; 

Đây là resolver tôi

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: bạn có tìm thấy giải pháp nào – Brune

+0

Bạn có tìm thấy giải pháp tốt cho điều này không? – James111

Trả lời

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

args truyền cho ĐỊA CHỈ đang đối số truyền cho Trường ADDRESSES tại thời điểm truy vấn. Trong phương thức giải quyết, obj phải là đối tượng sinh viên và nếu bạn có tài sản id trên đó, tất cả những gì bạn cần làm là: return Resolver(obj.id).Address();.

Các vấn đề liên quan