GraphQL错误:' instanceof'的右侧不可赎回

时间:2017-08-03 18:36:23

标签: javascript graphql instanceof graphql-js

我定义了以下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。

1 个答案:

答案 0 :(得分:1)

每当GraphQL解析一个Type时,它就会传递某种业务对象来使用它。它使用该业务对象来解析类型上的相应字段。您可以将isTypeOf方法视为检查,以确定传入的业务对象是否应解析为此特定类型。

在您的应用中,当您进行查询时,您将从数据库中获取数据并将其传递给类型解析器。您的isTypeOf方法需要做的是回答以下问题:此数据是否代表我尝试解决的类型?

如果您使用的ORM返回的实例(例如CompanyModel),则isTypeOf方法可以只是value instanceof CompanyModel.

如果您要找回一个不会从这样的描述性原型继承的对象,您可以实施其他任何必要的检查。例如,如果您的数据库行包含typename字段,则可以对此进行检查。

您可以正确使用isTypeOf here