Разрешение автоматически сгенерированных типов typescript-mongodb для вывода GraphQL - PullRequest
0 голосов
/ 19 марта 2020

Я использую плагин typescript-mongodb для graphql-codegen для генерации типов Typescript для извлечения данных из MongoDB и вывода их через 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']>,
...

И соответствующий объект БД

export type UserDbObject = {
  _id?: Maybe<String>,
  first_name: Maybe<string>,
...

Проблема заключается в том, что фактически отправляется обратно документ mon go как 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 Ответ

1 голос
/ 22 марта 2020

Вы можете использовать функцию mappers codegen для отображения между типами GraphQL и типами моделей. См .:

Поскольку все плагины codegen независимы и не связаны друг с другом, вы должны сделать это вручную, например:

config:
  mappers:
     User: UserDbObject

Это заставит плагин typescript-resolvers использовать UserDbObject в в любое время (как родительское значение или как возвращаемое значение).

Если вы хотите sh автоматизировать это, вы можете использовать программный коден программно (https://graphql-code-generator.com/docs/getting-started/programmatic-usage), или вы также можете создать файл .js вместо .yaml файл, который создаст раздел конфигурации в соответствии с вашими потребностями.

...