Я хотел бы установить преобразователь для отдельного поля, которое возвращает строку.
Для этого примера. Я хочу взять атрибут 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
}
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вот решение:
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
Ах, я вижу сложную часть - это называть это типом схемы. Странно, что я могу называть Product все, что хочу, но не Query. Я получаю это сейчас. Спасибо
@Ycon Обновление graphqldirective способом
Спасибо - директива кажется немного многословной для такого случая использования, но очень хорошо знать
Спасибо, но это кажется неправильным. Это будет делать
title.toUpperCase()каждый раз. Я хочу передать ему аргумент, чтобы определить, следует ли это делать.