GraphQL.js - 时间戳标量类型?

Posted

技术标签:

【中文标题】GraphQL.js - 时间戳标量类型?【英文标题】:GraphQL.js - timestamp scalar type? 【发布时间】:2019-01-20 16:24:02 【问题描述】:

我正在以编程方式构建一个 GraphQL 模式,并且需要一个 Timestamp 标量类型; Unix Epoch timestamp 标量类型:

const TimelineType = new GraphQLObjectType(
  name: 'TimelineType',
  fields: () => (
    date:   type: new GraphQLNonNull(GraphQLTimestamp)  ,
    price:  type: new GraphQLNonNull(GraphQLFloat)      ,
    sold:   type: new GraphQLNonNull(GraphQLInt)        
  )
);

不幸的是,GraphQL.js 没有GraphQLTimestampGraphQLDate 类型,所以上面的方法不起作用。

我期待Date 输入,我想将其转换为时间戳。我将如何创建自己的 GraphQL 时间戳类型?

【问题讨论】:

【参考方案1】:

有一个 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),Pavel Lang 提出了一个不错的GraphQLTimestamp.js 解决方案(我的TimestampType 来自他的)。

【讨论】:

以上是关于GraphQL.js - 时间戳标量类型?的主要内容,如果未能解决你的问题,请参考以下文章

蜂巢时间戳不接受 Spark 时间戳类型

时间戳有多少个默认版本

Sybase 中神秘的“时间戳”数据类型是啥?

java 将当前时间戳插入具有时间戳类型的Oracle数据库列

时间戳如何储存数据

什么是mysql 的时间戳