为 GraphQL 输出解析自动生成的 typescript-mongodb 类型
Posted
技术标签:
【中文标题】为 GraphQL 输出解析自动生成的 typescript-mongodb 类型【英文标题】:Resolving auto-generated typescript-mongodb types for GraphQL output 【发布时间】:2020-07-01 00:44:21 【问题描述】:我正在使用 typescript-mongodb
到 graphql-codegen
的插件来生成用于从 MongoDB 中提取数据并通过 Node 上的 GraphQL 输出的 Typescript 类型。
我的输入 GraphQL 架构如下所示
type User @entity
id: ID @id,
firstName: String @column @map(path: "first_name"),
...
生成的输出 Typescript 类型看起来正确
export type User =
__typename?: 'User',
id?: Maybe<Scalars['ID']>,
firstName?: Maybe<Scalars['String']>,
...
以及对应的DB对象
export type UserDbObject =
_id?: Maybe<String>,
first_name: Maybe<string>,
...
问题是当实际将 mongo 文档作为UserDbObject
发回时,我没有得到输出中映射的字段。我可以编写一个自定义解析器,将字段重新映射回User
类型,但这意味着我将字段映射到两个不同的地方。
即我没有从这样的解析器获取映射字段
userById: async(_root: any, args: QueryUserByIdArgs, _context: any) : Promise<UserDbObject> =>
const result = await connectDb().then((db) =>
return db.collection<UserDbObject>('users').findOne('_id': args.id).then((doc) =>
return doc;
);
)
...
return result as UserDbObject;
;
有没有办法使用typescript-mongodb
插件只需要在架构中映射这些字段,然后使用自动生成的代码来解决它们?
【问题讨论】:
【参考方案1】:您可以使用 codegen 的 mappers
功能在 GraphQL 类型和模型类型之间进行映射。
见:
由于所有 codegen 插件都是独立的并且没有链接在一起,您应该手动执行,例如:
config:
mappers:
User: UserDbObject
这将使typescript-resolvers
插件可以随时使用UserDbObject
(作为父值或返回值)。
如果您希望自动执行此操作,您可以以编程方式使用 codegen (https://graphql-code-generator.com/docs/getting-started/programmatic-usage),或者您也可以创建一个 .js
文件而不是 .yaml
文件,该文件将根据您的需要创建配置部分。
【讨论】:
以上是关于为 GraphQL 输出解析自动生成的 typescript-mongodb 类型的主要内容,如果未能解决你的问题,请参考以下文章
Type as property 使用 graphql-yoga 和 prisma 解析为 null
使用多个装饰器将 Type-GraphQL 与 Typegoose 相结合
如何使用 type-graphql 解析器函数获取 graphql 后端中的选定字段?
使用 type-graphql 和 RESTDataSource 为第二个 api 调用添加字段解析器