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

Я использую плагин typescript-mongodb для graphql-codegen для создания типов Typescript для извлечения данных из MongoDB и вывода их через GraphQL на Node.

Моя входная схема 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>,
...

Проблема в том, что при фактической отправке документа 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, чтобы отображать только эти поля в схеме, а затем использовать автоматически сгенерированный код для их разрешения?


person pyromanfo    schedule 19.03.2020    source источник


Ответы (1)


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

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

config:
  mappers:
     User: UserDbObject

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

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

person Dotan Simha    schedule 22.03.2020