为什么 GraphQL(在 Node.js 上)不调用我的 "resolve" 方法?

Why won't GraphQL (on Node.js) call my "resolve" method?

我正在尝试在 Node.js 中实现一个非常基本的 GraphQL 接口,但无论我做什么,我似乎都无法获得 fooresolve 方法类型触发。当我 运行 以下代码在单元测试中 运行 成功时,但我可以从(缺少)控制台输出中看到 resolve 未被调用,结果当我调用 graphql(FooSchema, query).

时,我得到一个空对象

任何对 GraphQL 更有经验的人都可以建议我可能做错了什么吗?如果 GraphQL 无法找到并调用应该 return 结果的方法,我对整个操作如何成功完成完全感到困惑...

const fooType = new GraphQLInterfaceType({
    name: `Foo`,
    description: `A foo`,
    fields: () => ({
        id: {
            description: `The foo's id`,
            type: new GraphQLNonNull(GraphQLInt),
        },
        title: {
            description: `The foo's title`,
            type: new GraphQLNonNull(GraphQLString),
        }
    })
});
const queryType = new GraphQLObjectType({
    fields: {
        foo: {
            args: {
                id: {
                    description: 'ID of the foo',
                    type: new GraphQLNonNull(GraphQLString)
                }
            },
            resolve: (root, { id }) => {
                console.log(12345); 
                return getFoo(id)
            },
            type: fooType,
        }
    },
    name: 'Query',
});

export default new GraphQLSchema({
    query: queryType,
    types: [fooType],
});

// In test:
const query = `
    foo {
        title
    }
`;
const result = graphql(FooSchema, query); // == {}
const fooType = new GraphQLInterfaceType({
    name: `Foo`,
    description: `A foo`,
    fields: () => ({
        id: {
            description: `The foo's id`,
            type: new GraphQLNonNull(GraphQLInt),
        },
        title: {
            description: `The foo's title`,
            type: new GraphQLNonNull(GraphQLString),
        }
    })
});

这是一种接口类型,但是您的使用者 queryType 从未 实现 它。一个快速的解决方案应该是将其更改为:

const fooType = new GraphQLObjectType({
    name: `Foo`,
    description: `A foo`,
    fields: () => ({
        id: {
            description: `The foo's id`,
            type: new GraphQLNonNull(GraphQLInt),
        },
        title: {
            description: `The foo's title`,
            type: new GraphQLNonNull(GraphQLString),
        }
    })
});

这是一个适合我的例子:

const {
  GraphQLNonNull,
  GraphQLInt,
  GraphQLString,
  GraphQLObjectType,
  GraphQLSchema,
  graphql,
} = require('graphql');

const fooType = new GraphQLObjectType({
  name: `Foo`,
  description: `A foo`,
  fields: () => ({
    id: {
      description: `The foo's id`,
      type: new GraphQLNonNull(GraphQLInt),
    },
    title: {
      description: `The foo's title`,
      type: new GraphQLNonNull(GraphQLString),
    },
  }),
});

const queryType = new GraphQLObjectType({
  fields: {
    foo: {
      args: {
        id: {
          description: 'ID of the foo',
          type: new GraphQLNonNull(GraphQLString),
        },
      },
      resolve: (root, { id }) => {
        return { id, title: 'some-title' };
      },
      type: fooType,
    },
  },
  name: 'Query',
});

const schema = new GraphQLSchema({
  query: queryType,
  types: [fooType],
});

graphql(schema, `{ foo (id:"123") { id, title } }`).then(console.log.bind(console));

这应该打印:

$ node test.js
{ data: { foo: { id: 123, title: 'some-title' } } }

这是关于 InterfaceType 的文档:http://graphql.org/learn/schema/#interfaces