【问题标题】:Cannot read property 'kind' of undefined at isDocumentNode while export makeExecutableSchema using Apollo Graphql on express js在 express js 上使用 Apollo Graphql 导出 makeExecutableSchema 时无法读取 isDocumentNode 处未定义的属性“种类”
【发布时间】:2018-07-03 00:49:45
【问题描述】:

我已经创建了这样的模式模块化:User.js

const gqTools = require('graphql-tools');

const user = `
  type User {
    emailId: String
    name: String
    type: Int
    created_on: String
  }
`;

module.exports = user

这是与用户类型架构相关的 UserPayload

const gqTools = require('graphql-tools');
const User = require('./User')

const userPayload = `
  enum ErrorCodes {
    UNAUTHORIZED
    INTERNAL_ERROR
  }
  type Error {
    code: ErrorCodes
    msg: String
  }
  type UserPayload {
    user: [User]
    error: Error
  }
`;

module.exports = () => [userPayload, User]

这是我创建的用户类型查询

const gqTools = require('graphql-tools');
const UserPayload = require('../UserPayload')

const query = `
  type Query {
    checkAuthorized: [UserPayload]

  }
`;

module.exports = () => [query, UserPayload]

这是我创建的解析器

const checkAuthorizedResolver = {
  async checkAuthorized(root, data, context) {
    if (context.user.length === 0) {
        return {
            user: null,
            error: {
                code: 'UNAUTHORIZED',
                msg: 'UNAUTHORIZED'
            }
        }
    }

    let s = `
        select email, name, usertype_id, created_at
        from users
        where id = ${context.user[0].id}
    `

    try {
        let result = await context.db.run(s)
        return {
            user: {
                emailId: result[0].email,
                name: result[0].name,
                type: result[0].usertype_id,
                created_on: result[0].created_at
            },
            error: null
        }
    } catch (err) {
        console.log(err)
        return {
            user: null,
            error: {
                code: 'UNAUTHORIZED',
                msg: 'UNAUTHORIZED'
            }
        }
    }
  }
}

module.exports = checkAuthorizedResolver

之后,我在架构文件夹上创建 main.js,该文件夹将在 server.js 上导入

const gqTools = require('graphql-tools');
const jwt = require('jsonwebtoken')
const { makeExecutableSchema } = require('graphql-tools')
const moment = require('moment')

const {
  checkAuthorized,
} = require('../schema/type_Query/type_Query')

const checkAuthorizedResolver = require ('../Controller/checkAuthorized')

module.exports = makeExecutableSchema({
  typeDefs: [checkAuthorized],
  resolvers:{
      checkAuthorizedResolver
  }
})

在我运行程序后它显示错误消息,我不明白错误消息中的“种类”是什么意思,因为我从未声明变量“种类”,我知道它来自节点模块库。大家可以帮我这个错误的含义以及如何在“makeExecutableSchema”上编写语法,因为我已经按照 GrahQL Tools 的文档进行模块化

这是错误信息:

> TypeError: Cannot read property 'kind' of undefined
>     at isDocumentNode (/home/hari/Documents/kerjaan/nest8gg/kpi/node_modules/graphql-tools/src/schemaGener
> ator.ts:134:42)
>     at /home/hari/Documents/kerjaan/nest8gg/kpi/node_modules/graphql-tools/src/schemaGenerator.ts:151:9
>     at Array.forEach (<anonymous>)
>     at concatenateTypeDefs (/home/hari/Documents/kerjaan/nest8gg/kpi/node_modules/graphql-tools/src/schema
> Generator.ts:150:22)
>     at buildSchemaFromTypeDefinitions (/home/hari/Documents/kerjaan/nest8gg/kpi/node_modules/graphql-tools
> /src/schemaGenerator.ts:190:21)
>     at _generateSchema (/home/hari/Documents/kerjaan/nest8gg/kpi/node_modules/graphql-tools/src/schemaGene
> rator.ts:80:18)
>     at makeExecutableSchema (/home/hari/Documents/kerjaan/nest8gg/kpi/node_modules/graphql-tools/src/schem
> aGenerator.ts:109:20)
>     at Object.<anonymous> (/home/hari/Documents/kerjaan/nest8gg/kpi/server/schema/main.js:41:18)
>     at Module._compile (module.js:643:30)
>     at Module._compile (/home/hari/Documents/kerjaan/nest8gg/kpi/node_modules/source-map-support/source-ma
> p-support.js:492:25)

【问题讨论】:

  • 你碰巧解决了这个问题吗?
  • 仍然没有找到解决这个问题的方法,我只是使用一个包含所有模式、突变和查询的文件来解决它,如文档所述。我还在尝试解决它,因为我上次发布的代码为图形 shema 和解析器模块化
  • 你得到答案了吗>

标签: javascript graphql apollo-server


【解决方案1】:

您很可能将undefined 作为类型传递,例如UserUserPayload

module.exports = () => [userPayload, User]

module.exports = () => [query, UserPayload]

您可以将它们注销并确保它们具有有效值:

console.log(User);
module.exports = () => [userPayload, User]

console.log(UserPayload);
module.exports = () => [query, UserPayload]

【讨论】:

  • 感谢您的建议,我会先尝试一下,因为在 graphql 中进行模块化对我来说有点困难
  • 当有人遇到同样的问题时,我有一些示例设置,我已经解决了这个问题你可以看看这个例子github.com/hariantara/new-server
猜你喜欢
  • 2018-12-12
  • 2019-05-12
  • 1970-01-01
  • 2020-07-06
  • 2020-02-01
  • 2020-12-03
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多