2

我正在使用该typescript-mongodb插件graphql-codegen生成 Typescript 类型,用于从 MongoDB 中提取数据并通过 Node.js 上的 GraphQL 输出。

我的输入 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插件只需要在模式中映射这些字段,然后使用自动生成的代码来解析它们?

4

1 回答 1

2

您可以使用mapperscodegen 的功能在 GraphQL 类型和模型类型之间进行映射。看:

由于所有 codegen 插件都是独立的并且没有链接在一起,因此您应该手动执行,例如:

config:
  mappers:
     User: UserDbObject

这将使typescript-resolvers插件可以随时使用UserDbObject(作为父值或返回值)。

如果您希望自动执行此操作,您可以以编程方式使用 codegen ( https://graphql-code-generator.com/docs/getting-started/programmatic-usage ),或者您也可以创建一个.js文件而不是.yaml文件根据您的需要创建配置部分。

于 2020-03-22T10:48:54.667 回答