GraphQL:如何将参数传递给子对象
问题描述:
我正在使用GraphQL来查询将由大约15个不同的REST调用组成的对象。这是我从查询中传入ID的根查询。这适用于正确解析的主要学生对象。但是,我需要弄清楚如何将ID传递给地址解析器。我尝试向地址对象添加参数,但是我得到一个错误,指示参数不从Student对象传递。所以我的问题是:我如何将客户端查询中的参数传递给GraphQL服务器中的子对象?GraphQL:如何将参数传递给子对象
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;
这些都是我的解析器
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;
答
ADDRESSES: {
type: new GraphQLList(Address),
resolve(obj, args, ast){
return Resolver(args.id).Address();
}
}
传递至ADDRESSES
ARG游戏参数传递给ADDRESSES字段在查询时间。在解决方法中,obj
应该是学生对象,如果您有id
属性,则只需要执行以下操作:return Resolver(obj.id).Address();
。
FallFast:你找到任何解决方案 – Brune
你找到一个好的解决方案吗? – James111