• GraphQL入门2


    将服务器端的代码升级了一下:

    var GraphQLSchema = require('graphql').GraphQLSchema;

    var GraphQLObjectType = require('graphql').GraphQLObjectType;

    var GraphQLString = require('graphql').GraphQLString;

    var GraphQLList = require('graphql').GraphQLList;

    var fetch = require('node-fetch');

    require("babel-polyfill");

    var BASE_URL = 'http://localhost:3000';

    var persons = [

        { id: "1", first_name: "Jack", last_name: "Zhang" , department: "Depart1", friends: [1] },

        { id: "2", first_name: "Tom", last_name: "Wang" , department: "Depart2", friends: [1, 2] }

    ];

    function getPersonByUrl(args, relativeURL) {

        var person = persons.find(function (item) {

            if (args.id) {

                return item.id == args.id;

            }

            if (args.department) {

                return item.department == args.department;

            }

           

        });

        return person;

        //fetch('${BASE_URL}${relativeURL}')

        //    .then(function (res) { return res.json() })

        //    .then(function (json) { return json.person })

    }

    function getFriendByPersonId(friendID) {

        var person = persons.find(function (item) {

            return item.id == friendID;

        });

       

        return person;

        //fetch('${BASE_URL}${relativeURL}')

        //    .then(function (res) { return res.json() })

        //    .then(function (json) { return json.person })

    }

    var PersonType = new GraphQLObjectType( {

        name: 'Person',

        description: '...',

        fields: ()=>({

            id: {

                type: GraphQLString,

                resolve : function (person) {

                    return person.first_name;

                }

            },

            firstName: {

                type: GraphQLString,

                resolve : function (person) {

                    return person.first_name;

                }

            },

            lastName: {

                type: GraphQLString,

                resolve : function (person) {

                    return person.last_name;

                }

            },

            department: {

                type: GraphQLString,

                resolve : function (person) {

                    return person.department;

                }

            },

            //email: { type: GraphQLString },

            //userName: { type: GraphQLString },

            //id: { type: GraphQLString },

            friends: {

                type: new GraphQLList(PersonType),

                resolve: function (person) {

                    return person.friends.map(getFriendByPersonId);

                }

            }

        })

    });

    var QueryType = new GraphQLObjectType({

        name: 'Query',

        desription: '...',

        fields: {

            person: {

                type: PersonType,

                args: {

                    id: { type: GraphQLString },

                    department: { type: GraphQLString }

                },

                resolve: function (obj, args, context, info) { return getPersonByUrl(args, null); }

            }

        }

       

    });

    var GraphQLSchemaObj = new GraphQLSchema({

        query: QueryType

    });

    module.exports = GraphQLSchemaObj;

    主要有以下几处更改:

    1. 将模拟的数据源persons单独提出来成为一个全局变量.
    2. 数据源中增加了department等几个属性.
    3. getPersonByUrl函数支持id和department参数.
    4. 增加了getFriendByPersonId函数用来解析friends属性.
    5. PersonType的fields属性使用了()=>来解决friends属性中使用本类型时本类型尚未初始化的问题.

    下面是客户端的测试代码:

    app.js

    console.log('Hello world');

    ////Arguments

    //var Test1 = require('./Test1');

    //Test1.Execute();

    ////Alias

    //var Test2 = require('./Test2');

    //Test2.Execute();

    ////Alias with sub-selection

    //var Test3 = require('./Test3');

    //Test3.Execute();

    ////Fragments

    //var Test4 = require('./Test4');

    //Test4.Execute();

    //Variblies

    //var Test5 = require('./Test5');

    //Test5.Execute();

    //Directives

    //var Test6 = require('./Test6');

    //Test6.Execute();

    具体的测试类:

    Alias:

    //Test2: Aliases 

    var gRequest = require('graphql-request').request;

    exports.Execute = function () {

        const query = '{'

                    + '  Depart1Person: person(department: "Depart1") {'

                    + '    firstName,'

                    + '    lastName,'

                    + '    department'

                    + '  }'

                    + '  Depart2Person: person(department: "Depart2") {'

                    + '    firstName,'

                    + '    lastName,'

                    + '    department'

                    + '  }'

                    + '}';

           

        gRequest('http://localhost:1337/graphql/graphql', query).then(function (data) { console.log(data) });

    };

                   

    运行结果如下:

    { Depart1Person: { firstName: 'Jack', lastName: 'Zhang', department: 'Depart1' },

      Depart2Person: { firstName: 'Tom', lastName: 'Wang', department: 'Depart2' } }

    Aliases -- sub selection

    //Test3: Aliases -- sub selection

    var gRequest = require('graphql-request').request;

    var util = require('util');

    exports.Execute = function () {

        const query = '{'

                    + '  Depart1Person: person(department: "Depart1") {'

                    + '    firstName,'

                    + '    lastName,'

                    + '    department,'

                    + '    friends'

                    + '    {'

                    + '     firstName,'

                    + '     lastName'

                    + '    }'

                    + '  }'

                    + '  Depart2Person: person(department: "Depart2") {'

                    + '    firstName,'

                    + '    lastName,'

                    + '    department,'

                    + '    friends'

                    + '    {'

                    + '     firstName,'

                    + '     lastName'

                    + '    }'   

                    + '  }'

                    + '}';

           

        gRequest('http://localhost:1337/graphql/graphql', query).then(function (data) {

            console.log(util.inspect(data, { showHidden: false, depth: null }))

        });

    };

    运行结果如下:

    { Depart1Person:

       { firstName: 'Jack',

         lastName: 'Zhang',

         department: 'Depart1',

         friends: [ { firstName: 'Jack', lastName: 'Zhang' } ] },

      Depart2Person:

       { firstName: 'Tom',

         lastName: 'Wang',

         department: 'Depart2',

         friends:

          [ { firstName: 'Jack', lastName: 'Zhang' },

            { firstName: 'Tom', lastName: 'Wang' } ] } }

    Fragements:

    //Test4: Fragements

    var gRequest = require('graphql-request').request;

    var util = require('util');

    exports.Execute = function () {

        var query = '{'

                    + '  Depart1Person: person(department: "Depart1") {'

                    + '    ...personFields'

                    + '  }'

                    + '  Depart2Person: person(department: "Depart2") {'

                    + '    ...personFields'

                    + '  }'

                    + '}'

                    + ''

                    + 'fragment personFields on Person {'

                    + '  firstName,'

                    + '  lastName,'

                    + '  department,'

                    + '  friends{'

                    + '    firstName,'

                    + '    lastName'

                    + '  }'

                    + '}';

           

        //gRequest('http://localhost:1337/graphql/graphql', query).then(function (data) { console.log(data) });

        gRequest('http://localhost:1337/graphql/graphql', query).then(function (data) {

            console.log(util.inspect(data, { showHidden: false, depth: null }))

        });

    };

     

    运行结果如下:

    { Depart1Person:

       { firstName: 'Jack',

         lastName: 'Zhang',

         department: 'Depart1',

         friends: [ { firstName: 'Jack', lastName: 'Zhang' } ] },

      Depart2Person:

       { firstName: 'Tom',

         lastName: 'Wang',

         department: 'Depart2',

         friends:

          [ { firstName: 'Jack', lastName: 'Zhang' },

            { firstName: 'Tom', lastName: 'Wang' } ] } }



    Varibles:

    //Test5: Variables

    var gRequest = require('graphql-request').request;

    var util = require('util');

    exports.Execute = function () {

        var query = 'query PersonWithDept($dept: String) {'

                + '  person(department: $dept) {'

                + '    ...personFields'

                + '  }'

                + '}'

                + ''

                + 'fragment personFields on Person {'

                + '  firstName,'

                + '  lastName,'

                + '  department,'

                + '  friends{'

                + '    firstName,'

                + '    lastName'

                + '  }'

                + '}';

       

                var varibles =

                {

                    "dept": "Depart1"

                };

           

        //gRequest('http://localhost:1337/graphql/graphql', query).then(function (data) { console.log(data) });

        gRequest('http://localhost:1337/graphql/graphql', query, varibles).then(function (data) {

            console.log(util.inspect(data, { showHidden: false, depth: null }))

        });

    };

    运行结果如下:

    { person:

       { firstName: 'Jack',

         lastName: 'Zhang',

         department: 'Depart1',

         friends: [ { firstName: 'Jack', lastName: 'Zhang' } ] } }   

    Directives:

    //Test6: Directives 

    var gRequest = require('graphql-request').request;

    var util = require('util');

    exports.Execute = function () {

        var query = 'query PersonWithDept($dept: String, $withFriends: Boolean!) {'

                    + '  person(department: $dept) {'

                    + '    ...personFields'

                    + '  }'

                    + '}'

                    + ''

                    + 'fragment personFields on Person {'

                    + '  firstName,'

                    + '  lastName,'

                    + '  department,'

                    + '  friends @include(if: $withFriends){'

                    + '    firstName,'

                    + '    lastName'

                    + '  }'

                    + '}' ;

       

            var varibles1 =

            {

                "dept": "Depart1",

                "withFriends": true

            };

       

            var varibles2 =

            {

                "dept": "Depart1",

                "withFriends": false

            };

           

        //gRequest('http://localhost:1337/graphql/graphql', query).then(function (data) { console.log(data) });

        gRequest('http://localhost:1337/graphql/graphql', query, varibles1).then(function (data) {

            console.log(util.inspect(data, { showHidden: false, depth: null }))

        });

        gRequest('http://localhost:1337/graphql/graphql', query, varibles2).then(function (data) {

            console.log(util.inspect(data, { showHidden: false, depth: null }))

        });

    };

    运行结果如下:

    { person: { firstName: 'Jack', lastName: 'Zhang', department: 'Depart1' } }

    { person:

       { firstName: 'Jack',

         lastName: 'Zhang',

         department: 'Depart1',

         friends: [ { firstName: 'Jack', lastName: 'Zhang' } ] } }

    注意客户端代码中使用了,是为了打印出json的子对象,

  • 相关阅读:
    delphi idhttpserver ajax 跨域解决方法
    【转】安卓apk反编译(三件套) (com.googlecode.d2j.DexException: not support version问题解决)
    C++ volatile的作用
    GetProcAddress函数
    c++ CArray函数
    CString中TrimLeft()与TrimRight()的用法
    使用Windows API进行串口编程
    SetCommMask
    AttachThreadInput
    关于CoInitialize和CoUninitialize调用的有关问题
  • 原文地址:https://www.cnblogs.com/time-is-life/p/9306028.html
Copyright © 2020-2023  润新知