Apollo Server:Eject 内置“上传”类型以使用 graphql-codegen 生成 TS 类型

Posted

技术标签:

【中文标题】Apollo Server:Eject 内置“上传”类型以使用 graphql-codegen 生成 TS 类型【英文标题】:Apollo Server: Eject built in "Upload" Type to generate TS Types with graphql-codegen 【发布时间】:2020-03-22 20:02:37 【问题描述】:

我正在使用graphql-codegen 来生成我的 GraphQL TypeDef 文件的 TS 类型。我还使用来自 apollo 服务器的内置 Upload 类型来处理文件上传,但 Upload TypeDef 不在我自己的模式中,它内置在 apollo-server 本身的某个地方。当我尝试通过graphql-codegen 生成时,我收到一个错误:

Error: Unknown type "Upload". Did you mean "Float"?

Unknown type "Upload". Did you mean "Float"?

因为它不在我自己的 typedef 文件中。

我可以以某种方式eject 内置的阿波罗“上传”类型来自己添加 typedef 吗?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。您必须定义自己的上传类型,在 codegen.yml 配置文件中定义自定义标量,以及其他一些内容。

# codegen.yml
config:
  scalars:
    Date: Date
    Upload: FileUpload

您可以使用 graphql-codegen (@graphql-codegen/add) 的插件添加内容在生成的文件中导入自定义 FileUpload 类型:

# codegen.yml
generates:
  # Schema ans resolvers types
  ./src/graphql/generated/schema.types.ts:
    plugins:
      - add:
          content: "import  FileUpload  from \"path/to/your/type/file\""
      - typescript
import  ReadStream  from "fs"

export interface FileUpload 
  filename: string
  mimetype: string
  encoding: string
  createReadStream(): ReadStream

顺便说一句,你应该安装@types/node。 而且,为了使事情更简单,您必须在您的 graphql 模式中定义一个标量(否则 graphl-cogeden 会告诉您 Upload 是未知的。

所以:

# schema.graphql
scalar Upload

而且,如果您使用 Apollo Server 2,默认 Apollo 的行为是在您的架构中自动添加 scalar Upload,因此您需要使用 makeExecutableSchema from,graphql-tools

const server = new ApolloServer(
  schema: makeExecutableSchema(
    typeDefs: schema,
    resolvers,
  )

享受吧!

【讨论】:

以上是关于Apollo Server:Eject 内置“上传”类型以使用 graphql-codegen 生成 TS 类型的主要内容,如果未能解决你的问题,请参考以下文章

graphql apollo-server 中的文件上传错误

使用 typegraphql (Apollo Server) 上传文件

为啥当我使用 apollo-server 上传文件时,文件已上传但文件为 0kb?

无法使用 apollo-server-micro 和 NextJS 上传 1MB 以上的文件

当我尝试使用 createReadStream 通过 apollo-server 上传文件时出现此错误,

在 apollo-server-express 中增加身体限制大小