设置GrapqQL日期格式

时间:2017-11-26 00:49:38

标签: node.js mongodb date graphql

我有一个mongoDB数据库,其中一个字段是ISO日期。 当我使用graphql(节点)查询查询表时,我收到了我的对象,但我在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自动设置。

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

 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)"

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

由于我的模型将其定义为String,因此不应对其进行操作,只保留格式。但它并没有。这让我感到困惑。

1 个答案:

答案 0 :(得分:3)

在解析器中,只需使用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. 创建自定义标量
  2. 或者使用已经为您执行上述操作的现有包