gpt4 book ai didi

node.js - 尽管存在数据,但在 GraphQL 查询中日期字段返回为 null

转载 作者:行者123 更新时间:2023-12-05 07:17:53 27 4
gpt4 key购买 nike

我在将一些数据从 PostgreSQL 数据库传输到服务时遇到问题。

设置的方式是这样的:

Service1 向 Service2 发送 GraphQL 请求以请求数据。 Service2 将此数据存储在从中获取信息的 PostgreSQL 数据库中。

数据被建模为带有来自 TypeORM 和 GraphQL 的装饰器的实体。我遇到问题的确切领域是:

   @Column({
nullable: true,
type: 'timestamp'
})
@Field(() => GraphQLISODateTime, {nullable: true})
executed_on: Date

当数据从数据库到达 service2 时,它存在,所有字段都在那里,日期字段及其值也存在。

从数据库中获取的字段:

"executed_on": "2019-10-27T23:00:00.000Z"

从Service1中获取的字段:

"executed_on": null

当它被发送到 service1 时,我可以 console.log 数据并在那里看到字段。我假设因为 GraphQL 以 JSON 格式发送数据,所以日期字段变成了一个字符串。现在,当此数据从 service1 传输到其他地方时,所有 executed_on 字段值都变为 null。我不知道发生这种情况的原因是什么。难道因为它现在是一个字符串,所以它没有被解析到 Date 字段中?

我发现的解决方法是循环遍历数组中的每个对象并简单地从当前字符串值创建一个新的 Date 对象,但这不是我想做的事情,因为当我在其他服务中也会发生此过程我正在从外部 REST API 获取数据,所以我猜这是一个糟糕的设计?我对此很陌生。

如有任何帮助,我们将不胜感激。

最佳答案

我遇到了类似的问题,我认为这是由于 DateTime 类型的 GraphQl Node 模块中的序列化错误造成的。

这是失败的原因:

// node_modules/graphql/execution/execute.js:
completeLeafValue(returnType, result) {
// this returns null even though a correct "value" is being passed in
var serializedResult = returnType.serialize(result);
...

因为它的序列化程序因“value instanceof Date”而失败,并简单地返回 null:

serialize(value) {
return value instanceof Date ? value.toISOString() : null;
}

出于某种原因 type=Date 被强制转换为“DateTime” 为什么我还没有弄明白,但在我看来它应该抛出一个错误而不是只返回 null。

正如您已经说过的:唯一的解决方法/解决方法是为对象树中的每个日期字段创建一个新的 Date(...) 对象。

或者 fork 原始存储库并将此代码添加到“completeLeafValue”方法:

//node_modules/graphql/execution/execute.js:
completeLeafValue(returnType, result) {
var serializedResult = returnType.serialize(result);
if(completeLeafValue==="DateTime") {
result = new Date(result);
//new Date(...) does not throw and only returns null when it fails
//so we have to check for null
if(result === null) {
throw new Error(`Cannot cast ${result} to Date object`);
}
}
...(rest or original fn)

关于node.js - 尽管存在数据,但在 GraphQL 查询中日期字段返回为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58622522/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com