当前位置: 首页 > 知识库问答 >
问题:

GraphQL:如何将参数传递给子对象

长孙淳
2023-03-14

我正在使用GraphQL查询一个对象,该对象将由大约15个不同的REST调用组成。这是我的根查询,我在其中传入查询的ID。这对于正确解析的主要student对象非常有效。但是,我需要弄清楚如何将ID传递给地址解析程序。我尝试将args添加到address对象,但出现了一个错误,表明args没有从Student对象传递下来。所以我的问题是:如何将客户机查询中的参数传递给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调用解析的my address对象:

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;

共有1个答案

束福
2023-03-14
ADDRESSES: {
    type: new GraphQLList(Address),
    resolve(obj, args, ast){
        return Resolver(args.id).Address();
    }
}

传递给地址的参数是在查询时传递给地址字段的参数。在resolve方法中,obj应该是student对象,如果它上有一个id属性,则只需执行以下操作:返回解析器(obj.id)。地址()

 类似资料:
  • 问题内容: 我正在A中使用RUN指令安装rpm 但是,我想将值“ 2.3”作为参数传递。我的RUN指令应类似于: 哪里 问题答案: 您正在寻找和指导。这些是Docker 1.9中的新功能。查看https://docs.docker.com/engine/reference/builder/#arg。这将允许您添加到,然后使用构建。

  • 问题内容: 我想将登录用户单击的sa 列表中的传递给twitter bootstrap 。我正在与 angularjs* 一起使用 grails ,其中数据是通过 angularjs 呈现的。 *** 组态 我的grails视图页面是 我的是 所以,我怎么能传递到? 问题答案: 我尝试如下。 我在 鼓励 按钮上打电话给angularjs控制器, 我设置的从angularjs控制器。 我提供了一个p

  • 问题内容: 这似乎是一个愚蠢的问题,但是我是这个话题的新手。我正在致力于关于节点js的承诺。我想将参数传递给Promise函数。但是我不知道。 而功能类似于 问题答案: 将Promise包裹在一个函数中,否则它将立即开始工作。另外,您可以将参数传递给函数: 然后,使用它: ES6: 用:

  • 我正在用Raku做实验,试图弄明白如何用子命令编写程序。当我运行时,: 我得到

  • 问题内容: 我正在使用Go内置的http服务器,并拍拍来响应一些URL: 我需要向该处理函数传递一个额外的参数-一个接口。 如何向处理程序函数发送额外的参数? 问题答案: 通过使用闭包,您应该能够做您想做的事情。 更改为以下内容(未测试): 然后对

  • 我在解一个有很多常数的非线性方程 我创建了一个用于解决以下问题的函数: 然后我想做: 但是正在解包并向函数传递太多参数,因此我得到: TypeError:terminalV()正好接受2个参数(给定6个) 那么,我的问题是,我是否可以通过某种方式将元组传递给调用的函数?