GraphQL buildSchema vs GraphQLObjectType

时间:2017-06-26 17:30:55

标签: schema graphql resolver object-type

我参加了GraphQL的Object Types教程,然后阅读了文档的Constructing Types部分。我通过创建一个简单的case convention converter进行了类似的样式试用。为什么?要学习:)

转换为使用GraphQLObjectType时,我希望获得与buildSchema相同的结果。

  1. 为什么buildSchema使用type CaseConventions,但在使用GraphQLObjectType时,它未设置为type?我在这里做错了吗?
  2. 我是否实施过任何令人担忧的问题?
  3. 我是否应该像使用rootValue版本一样使用GraphQLObjectType版本的buildQuery对象?
  4. 感谢您的耐心和帮助。


    两个版本都使用此对象:

    class CaseConventions {
    
      constructor(text) {
        this.text = text;
        this.lowerCase = String.prototype.toLowerCase;
        this.upperCase = String.prototype.toUpperCase;
      }
    
      splitTargetInput(caseOption) {
        if(caseOption)
          return caseOption.call(this.text).split(' ');
        return this.text.split(' ');
      }
    
      cssCase() {
        const wordList = this.splitTargetInput(this.lowerCase);
        return wordList.join('-');
      }
    
      constCase() {
        const wordList = this.splitTargetInput(this.upperCase);
        return wordList.join('_');
      }
    
    }
    
    module.exports = CaseConventions; 
    


    buildSchema版本:

    const schema = new buildSchema(`
      type CaseConventions {
        cssCase: String
        constCase: String
      }
      type Query {
        convertCase(textToConvert: String!): CaseConventions
      }
    `);
    
    const root = {
      convertCase: ({ textToConvert }) => {
        return new CaseConventions(textToConvert);
      }
    };
    
    app.use('/graphql', GraphQLHTTP({
      graphiql: true,
      rootValue: root,
      schema
    }));
    


    GraphQLObjectType版本:

    const QueryType = new GraphQLObjectType({
      name: 'Query',
      fields: {
        cssCase: {
          type: GraphQLString,
          args: { textToConvert: { type: GraphQLString } },
          resolve(parentValue) {
            return parentValue.cssCase();
          }
        },
        constCase: {
          type: GraphQLString,
          args: { textToConvert: { type: GraphQLString } },
          resolve(parentValue) {
            return parentValue.constCase()
          }
        }
      }
    });
    
    const RootQuery = new GraphQLObjectType({
      name: 'RootQueryType',
      fields: {
        convertCase: {
          type: QueryType,
          args: { textToConvert: { type: GraphQLString } },
          resolve(p, { textToConvert }) {
            return new CaseConventions(textToConvert);
          }
        }
      }
    });
    
    const schema = new GraphQLSchema({
      query: RootQuery
    });
    
    app.use('/graphql', GraphQLHTTP({
      graphiql: true,
      schema
    }));
    

1 个答案:

答案 0 :(得分:8)

我会尽力满意地回答你的问题。

  1. 为什么buildSchema使用CaseConventions类型但是在使用GraphQLObjectType时它没有设置类型?我在这里做错了吗

    它们是两种不同的实施方式。使用buildSchema使用graphQL架构语言,而GraphQLSchema不使用架构语言,它以编程方式创建架构。

  2. 我是否实施过任何令人担忧的问题?

    都能跟得上

  3. 我是否应该像使用buildQuery版本一样使用带有GraphQLObjectType版本的rootValue对象?

    不,在buildSchema中,root在使用时提供解析器 GraphQLSchema,根级解析器在Query和Mutation类型上实现,而不是在根对象上实现。