Apollo/GraphQL:用于时间戳的字段类型?

Posted

技术标签:

【中文标题】Apollo/GraphQL:用于时间戳的字段类型?【英文标题】:Apollo/GraphQL: Field Type to Use for Timestamp? 【发布时间】:2017-04-26 16:33:48 【问题描述】:

我正在将一个值存储到 timestamp with time zone 类型的 postgres 字段中。我在 Apollo 模式中将该字段定义为 int,但在解析器中收到此错误消息:

列“apptDateTime”是带时区的时间戳类型,但表达式是整数类型

查找GraphQL data types,我还没有看到任何类型被引用为对应于时间戳类型的字段。

对于数据库中时间戳类型的字段,在 Apollo 模式中使用的正确字段类型是什么?

【问题讨论】:

查看日期标量部分:graphql.org/learn/schema/#scalar-types 可能最好定义一个自定义标量。 我正在阅读日期和 Apollo,我注意到在 Tally 发布的内容中,需要为此添加自定义代码。我在这里找到了文档:dev.apollodata.com/tools/graphql-tools/… 文档定义了解析器映射,但似乎没有显示如何在架构和/或其他解析器中包含解析器映射。有人可以提供或链接到如何从您的其他 Apollo 解析器引用解析器映射的示例吗? 这是对 json 的处理方式:github.com/taion/graphql-type-json/blob/master/src/index.js 【参考方案1】:

我的突变工作包括一个带时区的时间戳类型字段。我通过将我的 apptDateTime 字段的架构从 Int 更改为 String,并传入一个 ISO 字符串来做到这一点。 Sequelize 和 Postgres 负责将其更改为带时区的 Timestamp 类型的字段。

2021 年更新:

这就是我这些天使用的东西。

续集:

  timeOfNonce: type: Sequelize.DATE 

架构:

 scalar DATETIME
 .....
 timeOfNonce: DATETIME

这些天我让 Sequelize 通过以下方式定义我的 SQL 表:

const deleteAllData_fromThisModel = false;
const alterThisTableToMatchDBConnectorsModel = true;

myDataModel.sync(force: deleteAllData_fromThisModel, 
                  alter: alterThisTableToMatchDBConnectorsModel).then(err => 
    console.log('myDataModel has been synced')
).catch(err => 
    throw err
);

【讨论】:

你能展示一些你的代码吗?你不需要 : require('pg').types.setTypeParser(1114, function(stringValue) return new Date(stringValue + "+0000"); // 例如,UTC 偏移量。使用任何你想要的偏移量。 );【参考方案2】:

我发现这种方式可以处理表单中的输入,需要从客户端(输入表单)转换到服务器,以及从服务器到客户端(输入表单)

Graphql:

    updatedAt: String

续集:

    updatedAt:   type: Sequelize.DATE ,

Postgresql:

    "createdAt" timestamp(6) with time zone DEFAULT now(),

值转换到服务器:

  value  = dateToISO(value);

向客户端转换值:

  if ( isNil(value) ) 
    value = '';
   else 
    value  =  value.toLocaleDateString() +' '+ value.toLocaleTimeString();
  

帮手:

let dateToISO = function (dateString) 
  if (!dateString) 
    return null;
  
  let p = dateString.split(/\D/g);
  /* It's up your date on input in this case come from DD-MM-YYYY
    for MM-DD-YYY use: return [p[1], p[2], p[0]].join('-'); */
  return [p[2], p[1], p[0]].join('-'); 

;

【讨论】:

以上是关于Apollo/GraphQL:用于时间戳的字段类型?的主要内容,如果未能解决你的问题,请参考以下文章

Apollo GraphQL:用于查询返回不同类型对象的模式?

具有动态键的对象的 Apollo/GraphQL 字段类型

具有动态键的对象的 Apollo/GraphQL 字段类型

具有动态键的对象的 Apollo/GraphQL 字段类型

具有嵌套字段类型条件的 Apollo graphql 查询

Apollo GraphQL:未在突变子字段上调用解析器