我正在使用
@graphql-codegen/cli
工具从我的 graphql 服务器生成打字稿类型。
这是我的codegen.yml
内容:
overwrite: true
schema: "http://localhost:3001/graphql"
documents: "src/**/*.graphql"
generates:
src/generated/graphql.tsx:
plugins:
- "typescript"
- "typescript-operations"
- "typescript-react-apollo"
./graphql.schema.json:
plugins:
- "introspection"
这是我用来生成类型的
package.json
脚本 (yarn schema
):
"schema": "graphql-codegen --config codegen.yml"
所有这些都是通过执行cli向导自动生成的
yarn codegen init
。
但是当我运行
yarn schema
时,这些是我得到的错误:
(服务器正在
http://localhost:3001/graphql
正常运行并公开图形模式。
感谢您的帮助和建议
这是托管在我的服务器中的 .graphql 文件(http://localhost:3001/graphql
# -----------------------------------------------
# !!! THIS FILE WAS GENERATED BY TYPE-GRAPHQL !!!
# !!! DO NOT MODIFY THIS FILE BY YOURSELF !!!
# -----------------------------------------------
"""Date custom scalar type"""
scalar Date
type Mutation {
create_user(user: UserInput!): User!
create_pofficer(pofficer: POfficerCreateInput!): POfficer!
create_incident(incident: TIncidentInput!): TIncident!
add_incident_type(incident_type: TIncidentTypeInput!): TIncidentType!
}
type POfficer {
_id: ID!
userid: ID!
user: User!
}
input POfficerCreateInput {
name: String!
surname: String!
phone: String!
}
type Query {
users: [User!]!
pofficers: [POfficer!]!
incidents: [TIncident!]!
incident_types: [TIncidentType!]!
}
type TIncident {
_id: ID!
createdAt: Date!
incidenttype_id: ID!
pofficer_id: ID!
toffender_id: ID
toffender_phone: String!
carnumber: String!
incident_status: String!
pofficer: POfficer!
toffender: User!
incident_type: TIncidentType!
}
input TIncidentInput {
incidenttype_id: ID!
pofficer_id: ID!
toffender_phone: String!
carnumber: String!
}
type TIncidentType {
_id: ID!
name: String!
description: String
}
input TIncidentTypeInput {
name: String!
description: String
}
type User {
_id: ID!
name: String!
surname: String!
email: String
phone: String!
}
input UserInput {
name: String!
surname: String!
email: String!
phone: String!
}
您共享的文件是您的架构(由服务器生成),但您似乎尚未在其上创建任何查询或突变。这将是代码生成无法正常工作的原因。
我建议您使用简单的查询创建一个新文件,例如:
get-users.query.graphql
query GetUsers {
user {
_id
__typename
name
surname
email
phone
}
}
并将其添加到您的
src
文件夹中(因为您的代码生成器配置为查找 .graphql
文件夹中的所有 src
文件)。然后重新运行 codegen 并查看是否运行良好。
之后,您可以使用查询和突变生成各种
.graphql
文件,并使用codegen生成相应的类型。
就我而言,我将所有查询重构为新文件夹中的单个文件:
lib/queries.tsx
。
然后我需要做的是将文件路径添加到
codegen.yml
:
documents:
- "./lib/queries.tsx"
您必须小心
documents
字段,因为当您初始化graphql-code
时,默认值是示例中提供的值(src/**/*.graphql
),但这在大多数情况下考虑的是React应用程序。
但是,在我的例子中,我使用 Next 并且没有
src
目录(尽管 create-next-app
为您提供了拥有 src
目录的选项)。因此,我需要指定那些扩展名为 .graphql
的文件的确切位置。
在其他新闻中,
.graphql
文件是必需的,因为我们告诉 codegen 我们想要请求什么数据,因此 codegen 应该为我们生成类型。
如您所知,您可能需要 graphql API 中的所有数据或仅其中的一部分。无论如何,codegen 将仅获取您请求的数据类型。
如果您不创建任何 .graphql 文件,codegen 将不会为您生成任何类型,因为它不知道它在寻找什么。
请检查你的操作文件的后缀,并根据后缀更改此文件,也许你的文件后缀是.ts或.js,默认情况下在codegen.yml文件中是
documents: "src/**/*.graphql"
将 .graphql 替换为你的操作文件名的后缀,如 .ts 或 .js
那是我的问题,或者可能是文件地址错误
在某些情况下,此错误可能是由于项目的绝对路径中有空格造成的。 例如:
/home/my project folder with spaces/node_modules/*
为生成的客户端文件指定一个不同的目录,然后为 graphql 文档所在的目录,例如:
const config: CodegenConfig = {
schema: 'http://localhost:4000/graphql',
documents: ['./src/graphql/queries.gql', './src/graphql/mutations.gql'],
generates: {
'./src/graphql/generated/': {
preset: 'client',
},
您会看到另一个不同的目录,称为“生成”。这解决了我的问题。
由于此评论,我能够修复它。