代码之家  ›  专栏  ›  技术社区  ›  ronen

GraphQL-用空格映射REST API字段名

  •  0
  • ronen  · 技术社区  · 5 年前

    当定义 userType 在服务器上的以下GraphQL模式中,如何将“name”字段重命名为“firstname”,同时仍引用 fakeDatabase ?

    official GraphQL docs

    var express = require('express');
    var graphqlHTTP = require('express-graphql');
    var graphql = require('graphql');
    
    // Maps id to User object
    var fakeDatabase = {
      'a': {
        id: 'a',
        name: 'alice',
      },
      'b': {
        id: 'b',
        name: 'bob',
      },
    };
    
    // Define the User type
    var userType = new graphql.GraphQLObjectType({
      name: 'User',
      fields: {
        id: { type: graphql.GraphQLString },
        // How can I change the name of this field to "firstname" while still referencing "name" in our database?
        name: { type: graphql.GraphQLString },
      }
    });
    
    // Define the Query type
    var queryType = new graphql.GraphQLObjectType({
      name: 'Query',
      fields: {
        user: {
          type: userType,
          // `args` describes the arguments that the `user` query accepts
          args: {
            id: { type: graphql.GraphQLString }
          },
          resolve: function (_, {id}) {
            return fakeDatabase[id];
          }
        }
      }
    });
    
    var schema = new graphql.GraphQLSchema({query: queryType});
    
    var app = express();
    app.use('/graphql', graphqlHTTP({
      schema: schema,
      graphiql: true,
    }));
    app.listen(4000);
    console.log('Running a GraphQL API server at localhost:4000/graphql');
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   Daniel Rearden    6 年前

    解析器可以用于任何类型,而不仅仅是 Query Mutation . 这意味着你可以很容易地做这样的事情:

    const userType = new graphql.GraphQLObjectType({
      name: 'User',
      fields: {
        id: {
          type: graphql.GraphQLString,
        },
        firstName: {
          type: graphql.GraphQLString,
          resolve: (user, args, ctx) => user.name
        },
      }
    })
    

    resolver函数指定,给定父值,该字段和上下文的参数,类型的任何实例的字段将解析为什么。它甚至每次都可以返回相同的静态值。

        2
  •  2
  •   Vincent Taing    6 年前

    还有一个图书馆 graphql-tools

    const { RenameTypes, transformSchema } = require("graphql-tools");
    
    /*
     * Schema transformations:
     * Types:
     *  <> Task -> GetTask
     */
    
    const transformMySchema = schema => {
      return transformSchema(schema, [
        new RenameTypes(function(name) {
          return name == "Task" ? "GetTask" : name;
        }),
      ]);
    };
    

    阅读更多: https://github.com/apollographql/graphql-tools/blob/513108b1a6928730e347191527cba07d68aadb74/docs/source/schema-transforms.md#modifying-types

    这能回答问题吗?

        3
  •  0
  •   denyzprahy    6 年前

    和丹尼尔说的一模一样。不管您的解析器名称是什么,您都可以 user.name