2017-08-03 29 views
0

我定义以下GraphQL类型:GraphQL错误: '的instanceof' 的右手边是不可呼叫

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 
    } 
} 

问题是在Company类型的isTypeOf,但我不知道为什么它无法评估的instanceof创建的类型。

帮助appreaciated。

回答

1

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

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

如果您使用的是收益的实例,例如,CompanyModel的ORM,那么isTypeOf方法可以简单地value instanceof CompanyModel.

如果您收到回一个对象,它不从继承描述这样的原型,你可以执行任何其他检查是必要的。例如,如果您的数据库行包含typename字段,则可以检查该字段。

您可以看到正确使用isTypeOfhere