我阅读了GraphQL的Object Types教程,然后通读了文档的Constructing Types部分。我通过创建一个简单的case convention converter进行了类似的样式试验。为什么?学习 :)
转换为使用GraphQLObjectType时,我希望获得与oj​​it_code相同的结果。

  • 为什么buildSchema使用buildSchema,但是在使用type CaseConventions时未将其设置为GraphQLObjectType吗?我在这里做错什么了吗?
  • 我是否在实现时遇到了任何令人震惊的问题?
  • 我应该像使用type版本那样使用rootValue版本的GraphQLObjectType对象吗?

  • 感谢您的耐心配合和帮助。

    两种版本都使用此对象:
    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
    }));
    

    最佳答案

    我会尽力回答您的问题。

  • 为什么buildSchema使用类型CaseConventions,但是在使用GraphQLObjectType时未将其设置为类型?我在这里做错什么了吗
    它们是两种不同的实现方式。使用buildSchema使用graphQL模式语言,而GraphQLSchema不使用模式语言,而是以编程方式创建模式。
  • 我是否在实现时遇到了任何令人震惊的问题?

  • 是否应该像对buildQuery版本一样使用GraphQLObjectType版本的rootValue对象?
    否,在buildSchema中,根目录在使用时提供解析器
    根级解析器GraphQLSchema是在Query和Mutation类型而不是在根对象上实现的。
  • 关于schema - GraphQL buildSchema与GraphQLObjectType,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44765316/

    10-12 13:53