我正在定义以下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
})
在节点上运行查询时,出现以下错误:
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
上,但是我不知道为什么它不能评估所创建类型的instance。 最佳答案
每当GraphQL解析类型时,它都会传递某种业务对象来使用。它使用该业务对象来解析类型上的各个字段。您可以将isTypeOf
方法视为一种检查,以确定传入的业务对象是否应解析为这种特定类型。
在您的应用程序中,进行查询时,您正在从数据库中获取数据并将其传递给类型解析器。您的isTypeOf
方法需要做的是回答这个问题:此数据是否表示我要解析的类型?
如果您使用的ORM返回一个实例,例如CompanyModel
,则isTypeOf
方法可以简单地是value instanceof CompanyModel.
如果您要取回一个不从这样的描述性原型继承的对象,则可以实施其他必要的检查。例如,如果您的数据库行包含typename
字段,则可以对此进行检查。
您可以看到isTypeOf
here的正确用法。