我定义了以下GraphQL类型:
interface.js
import {
GraphQLInterfaceType,
GraphQLNonNull,
GraphQLID
} from 'graphql';
const NodeInterface = new GraphQLInterfaceType({
name: 'Node',
fields: {
id: {
type: new GraphQLNonNull(GraphQLID)
}
}
});
export default NodeInterface;
type.js
import {
GraphQLObjectType,
GraphQLInputObjectType,
GraphQLNonNull,
GraphQLID,
GraphQLList,
GraphQLString,
GraphQLInt,
GraphQLBoolean
} from 'graphql';
import NodeInterface from '../interfaces';
import UserModel from '../../models/User';
const fields = {
id: {
type: new GraphQLNonNull(GraphQLID)
},
name: {
type: GraphQLString
},
users: {
type: new GraphQLList(UserType),
resolve(company) {
const { _id } = company;
return UserModel.find({ companyId: _id }).exec();
}
}
};
export const CompanyType = new GraphQLObjectType({
name: 'Company',
description: 'Company',
interfaces: [NodeInterface],
isTypeOf: value => value instanceof CompanyType, <<<< ERROR HERE
fields: fields
})
在节点I上运行查询时出现以下错误:
query {
node(id:"598360ab8713621aac426e88") {
... on Company {
id
name
}
}
}
结果:
{
"errors": [
{
"message": "Right-hand side of 'instanceof' is not callable",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"node"
]
}
],
"data": {
"node": null
}
}
问题出现在isTypeOf
类型的Company
,但我不知道为什么它无法评估所创建类型的实例。
帮助appreaciated。
答案 0 :(得分:1)
每当GraphQL解析一个Type时,它就会传递某种业务对象来使用它。它使用该业务对象来解析类型上的相应字段。您可以将isTypeOf
方法视为检查,以确定传入的业务对象是否应解析为此特定类型。
在您的应用中,当您进行查询时,您将从数据库中获取数据并将其传递给类型解析器。您的isTypeOf
方法需要做的是回答以下问题:此数据是否代表我尝试解决的类型?
如果您使用的ORM返回的实例(例如CompanyModel
),则isTypeOf
方法可以只是value instanceof CompanyModel.
如果您要找回一个不会从这样的描述性原型继承的对象,您可以实施其他任何必要的检查。例如,如果您的数据库行包含typename
字段,则可以对此进行检查。
您可以正确使用isTypeOf
here。