【发布时间】:2020-12-14 07:27:18
【问题描述】:
我有一个关于 MongoDB ISODate 类型和 GraphQL 的问题。我需要在我的 gql 架构中声明一个 mutation,它允许在我的 Mongo 数据库中添加一个文档。
此文档具有 ISODate 属性,但在我的 gql 架构中,我使用的是 String:
mutation addSomething(data: SomeInput)
type SomeInput {
field1: String
field2: Int
created: String
}
我的问题是,在新文档中,created 字段是字符串格式(不是 ISODate),而我对此有所期待。但我想知道如何让它插入一个 ISODate。我可以在某个地方使用“自定义类型”来代替 String 吗?
谢谢
PS:我正在使用 nodeJS 和 apollo 库。
编辑 1:尝试使用 graphql-iso-date 包
我发现这个包https://www.npmjs.com/package/graphql-iso-date 添加了 3 种日期自定义类型。
这是我的 gql 架构:
const { gql } = require('apollo-server');
const { GraphQLDateTime } = require('graphql-iso-date')
const typeDefs = gql`
scalar GraphQLDateTime
type Resto {
restaurant_id: ID!
borough: String
cuisine: String
name: String
address: Address
grades: [Grade]
}
type Address {
building: String
street: String
zipcode: String
coord: [Float]
}
type Grade {
date: GraphQLDateTime
grade: String
score: Int
}
input GradeInput {
date: GraphQLDateTime
grade: String
score: Int
}
extend type Query {
GetRestos: [Resto]
GetRestoById(id: ID!): Resto
}
extend type Mutation {
UpdateGradeById(grade: GradeInput!, id: ID!): Resto
RemoveGradeByIdAndDate(date: String, id: ID!): Resto
}
`
module.exports = typeDefs;
这是基于sample restaurants dataset的测试。
所以,如果我尝试像这样调用UpdateGradeById() 函数:
UpdateGradeById(grade:{date:"2020-08-25T08:00:00.000Z",grade:"D",score:15},id:"30075445"){...}
文档已更新,但日期始终为字符串格式(如您在下面的屏幕截图中所见):
列表中最后一个年级的日期被识别为字符串(而不是日期)。
我可以看到改进,因为在我使用之前,graphql-iso-date 日期字段以时间戳格式返回。现在它们作为 ISO 字符串返回。但是插入没有按预期工作。
【问题讨论】:
-
hmmm .... 刚开始在 apollo 文档中输入“custom”?
-
我希望如果您将数据作为 JS 日期提供,您会得到它作为正确的时间戳类型插入。
-
是的,所以我的 graphQL 模式需要一个 JS 日期类型。我找到了这个:npmjs.com/package/graphql-iso-date 我会试试...
-
定义类型是不够的......阅读阿波罗文档!
-
@xadm :是的,谢谢,我忘记了解析器部分。我的坏^^