Установите преобразователь для отдельного поля с помощью GraphQL

Я хотел бы установить преобразователь для отдельного поля, которое возвращает строку.

Для этого примера. Я хочу взять атрибут title и сделать его .toUpperCase

Схема

type Product {
  title(uppercase:Boolean!): String!
}
type Query {
  products: [Product]
}

Резольвер

Query: {
    products: () => [{title:'foo'}],
    products.title: (stringToRtn, { action }) => {
    return action ? stringToRtn.toUpperCase : stringToRtn
  }
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
256
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот решение:

const resolvers = {
  Product: {
    title: product => {
      return product.title.toUpperCase();
    }
  },
  Query: {
    products: () => [{title:'foo'}]
  }
};

typeDefs:

type Product {
  title: String!
}
type Query {
  products: [Product]
}

Другой способ - использовать специальную директиву, например «@upperCase», но для этого она слишком сложна.

способ обновления директивы

Реализация директивы @uppercase:

import { SchemaDirectiveVisitor } from 'graphql-tools';
import { GraphQLField, defaultFieldResolver } from 'graphql';

class UppercaseDirective extends SchemaDirectiveVisitor {
  public visitFieldDefinition(field: GraphQLField<any, any>) {
    const { resolve = defaultFieldResolver } = field;
    field.resolve = async function resolver(...args) {
      const result = resolve.apply(this, args);
      if (typeof result === 'string') {
        return result.toUpperCase();
      }
      return result;
    };
  }
}

export { UppercaseDirective };

typeDefs.ts:

const typeDefs: string = `
  enum Status {
    SOLD_OUT
    NO_STOCK
    OUT_OF_DATE @deprecated(reason: "This value is deprecated")
  }

  type Book {
    id: ID!
    title: String @uppercase
    author: String
    status: Status
    name: String @deprecated(reason: "Use title instead")
  }

  type Query {
    books: [Book]!
    bookByStatus(status: Status!): [Book]!
  }
`;

schema:

const schema: GraphQLSchema = makeExecutableSchema({
  typeDefs,
  resolvers,
  schemaDirectives: {
    deprecated: DeprecatedDirective,
    uppercase: UppercaseDirective
  }
});

Вот исходный код: https://github.com/mrdulin/apollo-server-express-starter/tree/master/src/custom-directive

Спасибо, но это кажется неправильным. Это будет делать title.toUpperCase() каждый раз. Я хочу передать ему аргумент, чтобы определить, следует ли это делать.

Ycon 16.08.2018 04:59

Ах, я вижу сложную часть - это называть это типом схемы. Странно, что я могу называть Product все, что хочу, но не Query. Я получаю это сейчас. Спасибо

Ycon 07.09.2018 08:27

@Ycon Обновление graphqldirective способом

slideshowp2 07.09.2018 10:52

Спасибо - директива кажется немного многословной для такого случая использования, но очень хорошо знать

Ycon 08.09.2018 15:20

Другие вопросы по теме