查询 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'
}
])
};
我有一个 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'
}
])
};