NodeJS/GraphQL:尝试使用自定义 DateTime 标量,但出现错误

Posted

技术标签:

【中文标题】NodeJS/GraphQL:尝试使用自定义 DateTime 标量,但出现错误【英文标题】:NodeJS/GraphQL: Trying to use a custom DateTime scalar and I'm getting an error 【发布时间】:2019-12-28 09:00:18 【问题描述】:

我正在学习一个教程,老师在他的 createdAt 字段中使用 String 类型,并建议如果我们愿意,可以将自定义标量类型用于更强类型的 DateTime 字段,所以我试图做到这一点。

我收到以下错误:Error: Unknown type "GraphQLDateTime".

这是有问题的代码:

const  gql  = require('apollo-server')
const  GraphQLDateTime  = require('graphql-iso-date')

module.exports = gql`
  type Post 
    id: ID!
    username: String!
    body: String!
    createdAt: GraphQLDateTime!
  
  type User 
    id: ID!
    email: String!
    token: String!
    username: String!
    createdAt: GraphQLDateTime!
  
  input RegisterInput 
    username: String!
    password: String!
    confirmPassword: String!
    email: String!
  
  type Query 
    getPosts: [Post]
    getPost(postId: ID!): Post
  
  type Mutation 
    register(registerInput: RegisterInput): User
    login(username: String!, password: String!): User!
    createPost(body: String!): Post!
    deletePost(postId: ID!): String!
  
`

我已经添加了graphql-iso-date 库,而 VSCode 的智能感知正在接收它,所以我知道这不是问题所在。这也表明GraphQLDateTime 没有在文件中的任何地方使用,即使我正在引用它。

我知道这可能是一个简单的解决方法,但在 NodeJS 的上下文中我对 NodeJS 和 GraphQL 还是很陌生。知道我做错了什么吗?还有另一个 DateTime 标量可能更可取(最佳实践总是一个好主意。)谢谢!

【问题讨论】:

【参考方案1】:

使用apollo-servergraphql-tools 添加自定义标量有两个步骤:

    将标量定义添加到您的类型定义中:

    scalar DateTime
    

    将实际的 GraphQLScalar 添加到您的解析器映射中:

    const  GraphQLDateTime  = require('graphql-iso-date')
    
    const resolvers = 
      /* your other resolvers */
      DateTime: GraphQLDateTime,
    
    

请注意,解析器映射中的键(这里我使用DateTime)必须与您在步骤 1 中用作标量名称的任何内容匹配。这也是您在类型定义中使用的名称。名称本身是任意的,但需要匹配。

更多详情请见the docs。

【讨论】:

以上是关于NodeJS/GraphQL:尝试使用自定义 DateTime 标量,但出现错误的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs GraphQL 片段解析器

NodeJs GraphQL 动态查询变量

javascript 具有报告列链接的Javascript SET页面项目(自定义DA)

React Apollo - nodejs graphql后端返回异步响应后如何重新获取(更新)数据

在WebGL场景中使用2DA*寻路

我的 WPF 自定义控件 Datacontext 正在取代父母