为什么赢了';t GraphQL(在Node.js上)调用my";“解决”;方法?

为什么赢了';t GraphQL(在Node.js上)调用my";“解决”;方法?,graphql,graphql-js,Graphql,Graphql Js,我试图在Node.js中实现一个非常基本的GraphQL接口,但无论我做什么,我似乎都无法触发我的foo类型的resolve方法。当我在单元测试中运行以下代码时,它成功地运行了,但是我可以从控制台输出(缺少)中看到,resolve没有被调用,因此当我调用graphql(FooSchema,query)时,我得到了一个空对象 有谁对GraphQL更有经验,能告诉我可能做错了什么吗?如果GraphQL无法找到并调用应该返回结果的方法,那么整个操作如何能够成功完成,我完全感到困惑 const fooT

我试图在Node.js中实现一个非常基本的GraphQL接口,但无论我做什么,我似乎都无法触发我的
foo
类型的
resolve
方法。当我在单元测试中运行以下代码时,它成功地运行了,但是我可以从控制台输出(缺少)中看到,
resolve
没有被调用,因此当我调用
graphql(FooSchema,query)
时,我得到了一个空对象

有谁对GraphQL更有经验,能告诉我可能做错了什么吗?如果GraphQL无法找到并调用应该返回结果的方法,那么整个操作如何能够成功完成,我完全感到困惑

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); // == {}
这是一种接口类型,但是您的使用者
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上的文档:

感谢您的建议:我一直在复制/粘贴《星球大战》示例,我一定没有对复制的内容类型给予足够的关注。但是,将
fooType
更改为一个新的
GraphQLObjectType
并不能解决我的问题:我的
resolve
仍然没有被调用,而
graphql
调用仍然返回一个空对象:(返回getFoo(id)到底做了什么?什么都没有(或者更准确地说,它是不相关的),因为它甚至从未被调用。这是根本问题:如果我能让
graphql
调用它(通过
resolve
),我就会被设置好。我编辑了我的答案,以便在使用此查询时显示在本地适用的代码:`{foo(id:“123”){id title}我直接复制/粘贴了你的代码,然后运行了我的测试,它就是
graphql(FooSchema,'foo(id:'123”){id title})“
…我仍然得到一个空对象。当我修改你的
解析
方法来执行
控制台。log
时,我看不到日志输出。我完全相信你的代码在你的机器上运行……可能有任何环境因素吗?
$ node test.js
{ data: { foo: { id: 123, title: 'some-title' } } }