在Next.js×Hasura中,graphql-codegen的生成出错

我正在使用 Next.js/Hasura on Heroku/Apollo 进行个人开发。最近尝试使用 graphql-codegen 生成 GraphQL 的类型定义时遇到了困难,因此我将其记录下来作为备忘。

环境

Hasura 版本号为 v1.3.3。

下一个版本是10.0.6,
GraphQL版本为15.5.0,
@graphql-codegen/cli版本为1.21.3,
@graphql-codegen/typescript版本为1.21.1,
@graphql-codegen/typescript-operations版本为1.17.15,
@graphql-codegen/typescript-react-apollo版本为2.2.3。

错误内容

生成上述模块后,我创建了以下的yml文件,并运行了yarn graphql-codegen –config src codegen.yml进行操作。

overwrite: true
schema: 
  - "[★hasuraエンドポイントURL]":
    headers:
      "x-hasura-admin-secret": ${process.env.HASURA_GRAPHQL_ADMIN_SECRET}
documents: 
  - "src/{components,pages,apollo}/**/*.{ts,tsx}"
generates:
  src/apollo/graphql.tsx:
    plugins:
      - "typescript"
      - "typescript-operations"
      - "typescript-react-apollo"
    config:
      skipTipename: false
      withHooks: true
      withHOC: false
      withComponent: false
      preResolveTypes: false
      reactApolloVersion: 3
      namingConvention: 
        typeNames: "pascal-case#pascalCase"
        enumValues: "upper-case#upperCase"
      apolloReactCommonImportFrom: "@apollo/client"
      apolloReactHooksImportFrom: "@apollo/client"

然后出现以下错误… de …)

  ✔ Parse configuration
  ❯ Generate outputs
    ❯ Generate src/apollo/graphql.tsx
      ✔ Load GraphQL schemas
      ✔ Load GraphQL documents
      ✖ Generate
        → Cannot read property 'name' of undefined
    ✔ Generate src/apollo/graphql.schema.json


 Found 1 error

  ✖ src/apollo/graphql.tsx
    TypeError: Cannot read property 'name' of undefined
        at /Users/s-kawabe/Desktop/Kiraku/node_modules/graphql/type/introspection.js:613:17
        at Array.some (<anonymous>)
        at Object.isIntrospectionType (/Users/s-kawabe/Desktop/Kiraku/node_modules/graphql/type/introspection.js:611:29)
        at Object.Field (/Users/s-kawabe/Desktop/Kiraku/node_modules/@graphql-codegen/typescript/index.cjs.js:354:25)
        at Object.enter (/Users/s-kawabe/Desktop/Kiraku/node_modules/graphql/utilities/TypeInfo.js:370:25)
        at Object.visit (/Users/s-kawabe/Desktop/Kiraku/node_modules/graphql/language/visitor.js:243:26)
        at documents.forEach.doc (/Users/s-kawabe/Desktop/Kiraku/node_modules/@graphql-codegen/typescript/index.cjs.js:359:38)
        at Array.forEach (<anonymous>)
        at includeIntrospectionDefinitions (/Users/s-kawabe/Desktop/Kiraku/node_modules/@graphql-codegen/typescript/index.cjs.js:359:15)
        at Object.plugin (/Users/s-kawabe/Desktop/Kiraku/node_modules/@graphql-codegen/typescript/index.cjs.js:341:38)

可能没有人遇到相同的情况,原因也不明确…
我也怀疑是环境变量的问题,尝试直接输入Hasura的秘钥,但还是遇到相同的错误。

解决方案(开发策略)

通过使用JS代码将上述内容重写并加载到这里,成功生成了类型定义文件!

// eslint-disable-next-line @typescript-eslint/no-var-requires
const dotenv = require('dotenv')

dotenv.config()

module.exports = {
  schema: [
    {
      '[★hasuraエンドポイントURL]': {
        headers: { 'x-hasura-admin-secret': process.env.HASURA_GRAPHQL_ADMIN_SECRET },
      },
    },
  ],
  documents: ['src/{components,pages,apollo}/**/*.{ts,tsx}'],
  overwrite: true,
  generates: {
    'src/apollo/graphql.tsx': {
      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'],
      config: {
        skipTypename: false,
        withHooks: true,
        withHOC: false,
        withComponent: false,
        preResolveTypes: false,
        scalars: {
          uuid: 'string',
          timestamptz: 'string',
          bigint: 'number',
          _text: 'string[]',
        },
        namingConvention: {
          typeNames: 'pascal-case#pascalCase',
          enumValues: 'upper-case#upperCase',
        },
        apolloReactCommonImportFrom: '@apollo/client',
        apolloReactHooksImportFrom: '@apollo/client',
      },
    },
  },
}

最后

[参考文章]
https://qiita.com/mizchi/items/fb9f598cea94d2c8072d
https://qiita.com/ryo2132/items/601ec3c085fcd99658e5

[Paraphrased Version]
https://qiita.com/mizchi/items/fb9f598cea94d2c8072d
https://qiita.com/ryo2132/items/601ec3c085fcd99658e5

我参考的文章使用了YAML进行编写,但是在这次的技术堆栈中可能存在兼容性问题吗?

广告
将在 10 秒后关闭
bannerAds