我正在定义以下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的正确用法。

09-18 22:44