查询 graphQL 中继调用时出现问题(.then 不是函数)

Issue in querying graphQL relay calls (.then is not a function)

我有一个 graphql 服务器 运行,我用它来查询服务器启动时实例化的对象之一(一种内存数据库)。每次加载架构或启动服务器时都会创建公司对象,我在 QueryType 对象中使用它来解析。

这是 graphQL 架构

const {
    GraphQLSchema,
    GraphQLObjectType,
    GraphQLString,
    GraphQLInt,
    GraphQLList
    } = require('graphql');
const {
    connectionDefinitions,
    connectionArgs,
    connectionFromArray,
    connectionFromPromisedArray
    } = require('graphql-relay');




//**************************** In-Memory Data ********************************//
var company = {
    id:'123456',
    customFieldDefinitions:[
        {
            name: 'cfm1',
            id: '123'
        },
        {
            name: 'cfm2',
            id: '1234'
        }
    ]
};
//**************************** In-Memory Code Ends *********************************//


const CustomFieldDefinitionType = new GraphQLObjectType({
    name: 'Common_CustomFieldDefinitionsConnection',
    fields: {
        id: {
            type: GraphQLString,
            resolve: (cfd) => cfd.id
        },
        name: {
            type: GraphQLString,
            resolve: (cfd) => cfd.name
        }
    }
});

const { connectionType: CustomFieldDefinitionConnection } =
    connectionDefinitions({
        name: 'Common_CustomFieldDefinition',
        nodeType: CustomFieldDefinitionType
    });


const CompanyType = new GraphQLObjectType({
    name: 'Company',
    fields: {
        id: {
            type: GraphQLString,
            resolve: (obj) => obj.id
        },
        customFieldDefinitions: {
            type: CustomFieldDefinitionConnection,
            description: 'A list of Custom Fields',
            args: connectionArgs,
            resolve: (obj, args) => connectionFromPromisedArray(obj.customFieldDefinitions, args)
        }
    }
});

const QueryType = new GraphQLObjectType({
    name: 'Query',
    fields: {
        company: {
            args: {
                id: { type: GraphQLString },
            },
            type: CompanyType,
            resolve: (_, args) => company
        }
    }
});

const mySchema = new GraphQLSchema({
    query: QueryType
});

module.exports = mySchema;

现在,当我尝试在 graphiQL 编辑器上进行如下查询时

query{
  company{
    customFieldDefinitions {
      edges {
        node {
          id
        }
      }
    }
  }
}

我收到如下错误。

{
  "data": {
    "company": {
      "customFieldDefinitions": null
    }
  },
  "errors": [
    {
      "message": "dataPromise.then is not a function",
      "locations": [
        {
          "line": 3,
          "column": 5
        }
      ],
      "path": [
        "company",
        "customFieldDefinitions"
      ]
    }
  ]
}

如何确定问题?

看起来错误与此行有关:

resolve: (obj, args) => connectionFromPromisedArray(obj.customFieldDefinitions, args)

问题是从 graphql-relay 导入的 connectionFromPromisedArray 函数需要一个承诺,即 return 是一个数组,而 obj.customFieldDefinitions 是一个普通数组。追溯一下,obj 是该解析器的父元素,在这种情况下,它是您从 Query 类型的 company 解析器 return 得到的元素。

要修复它,请将 connectionFromPromisedArray 更改为 connectionFromArray 或将您的公司对象更改为:

var company = {
  id:'123456',
  customFieldDefinitions: Promise.resolve([
    {
      name: 'cfm1',
      id: '123'
    },
    {
      name: 'cfm2',
      id: '1234'
    }
  ])
};