Я создаю схему GraphQL программно и нуждаюсь в скалярном типе Timestamp; скалярный тип Метка времени Unix Epoch:
const TimelineType = new GraphQLObjectType({
name: 'TimelineType',
fields: () => ({
date: { type: new GraphQLNonNull(GraphQLTimestamp) },
price: { type: new GraphQLNonNull(GraphQLFloat) },
sold: { type: new GraphQLNonNull(GraphQLInt) }
})
});
К сожалению, GraphQL.js не не имеет типа GraphQLTimestamp или GraphQLDate, поэтому вышеперечисленное не работает.
Я ожидаю ввода Date и хочу преобразовать его во временную метку. Как мне создать собственный тип метки времени GraphQL?



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


Существует пакет NPM с набором совместимых с RFC 3339 скалярных типов даты и времени GraphQL; graphql-iso-date.
Но для начала вам следует использовать GraphQLScalarType для создания собственного скалярного типа в GraphQL программно:
/** Kind is an enum that describes the different kinds of AST nodes. */
import { Kind } from 'graphql/language';
import { GraphQLScalarType } from 'graphql';
const TimestampType = new GraphQLScalarType({
name: 'Timestamp',
serialize(date) {
return (date instanceof Date) ? date.getTime() : null
},
parseValue(date) {
try { return new Date(value); }
catch (error) { return null; }
},
parseLiteral(ast) {
if (ast.kind === Kind.INT) {
return new Date(parseInt(ast.value, 10));
}
else if (ast.kind === Kind.STRING) {
return this.parseValue(ast.value);
}
else {
return null;
}
},
});
Но вместо того, чтобы заново изобретать колесо, этот вопрос (# 550) уже обсуждался, и Павел Ланг придумал достойное решение GraphQLTimestamp.js (мой TimestampType является производным от его).