设置GraphQL日期格式

6

我有一个MongoDB数据库,其中一个字段是ISO日期。当我使用GraphQL(node)查询表时,我可以正确地收到我的对象,但在GraphiQL中看到的日期格式是这种奇怪的格式:

"created": "Sun Nov 26 2017 00:55:35 GMT+0100 (CET)"

如果我在解析器中写出该字段,则显示如下:
2017-11-25T23:55:35.116Z

如何更改日期格式,以便在 GraphiQL 中显示 ISO 日期?

我的数据类型中该字段只是声明为字符串。

编辑 我的简单类型定义如下:

type MyString {
  _id: String
  myString: String
  created: String
}

当我向MongoDB插入一个值时,它会自动设置创建的基础。

当我运行查询时,它会返回一个对象数组。在我的解析器(用于检查)中,我执行以下操作:

 getStrings: async (_, args) => {
        let myStrings = await MyString.find({});
        for (var i = 0; i < myStrings.length; i++) {
            console.log(myStrings[i]["created"]);
        }

    return myStrings;
}

返回的数组中,所有创建的对象日期都具有以下格式:
2017-11-25T23:55:35.116Z

但是当我在 GraphIql 中看到它时,它显示为:

"created": "Sun Nov 26 2017 00:55:35 GMT+0100 (CET)"

我的问题是:为什么它会改变格式?

由于我的模型将其定义为字符串,因此不应该被操纵,而应该保留格式。但它并没有。这让我感到困惑。

Kim

2个回答

11
在你的解析器中,只需返回一个使用 toISOString() 格式化的字符串即可。
const date1 = new Date('2017-11-25T23:45:35.116Z').toISOString();
console.log({date1});
// => { date1: '2017-11-25T23:45:35.116Z' }

const date2 = new Date('Sun Nov 26 2017 00:55:35 GMT+0100 (CET)').toISOString();
console.log({date2})
// => { date2: '2017-11-25T23:55:35.000Z' }

回答增加的问题“为什么[日期字符串]会改变格式”

Mongo不会将日期存储为字符串,而是将其保存为Unix纪元(也称为Unix时间,POSIX时间),即自1970年1月1日起经过的秒数,不包括闰秒(在ISO 8601中表示为:1970-01-01T00:00:00Z)。由于您的数据模型需要一个字符串,它将使用toString()来强制转换这个值。

const date1 = new Date('2017-11-25T23:45:35.116Z').toString();
console.log({date1})
// => { date1: 'Sat Nov 25 2017 15:45:35 GMT-0800 (PST)' }
那应该为您澄清行为,但您可能真正想做的是更改模型,使created正确地作为Date类型。您可以通过以下几种方式实现:
  1. 创建自定义标量
  1. 或使用已经为您完成上述操作的现有包

1
感谢您抽出时间来帮助我。我已经稍微编辑了我的问题。 - Kim Gabrielsen

0

你只需要按照以下步骤操作:

  1. 将你的字段类型设置为Object
  2. 在你的 .graphql 文件中插入代码行 scalar Object
  3. 在 pom.xml 文件中添加依赖 graphql-java-extended-scalars
  4. 在 buildRuntimeWiring 函数中添加语法 .scalar(ExtendedScalars.Object)

试一试吧。 我尝试了一下,成功了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接