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

aar*_*ona 3 node.js graphql graphql-js

我正在学习一个教程,其中老师正在String为他的createdAt字段使用类型,并建议如果我们愿意,可以使用自定义标量类型来处理更强类型的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!
  }
`
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*den 6

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

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

    scalar DateTime
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将实际的 GraphQLScalar 添加到解析器映射中:

    const { GraphQLDateTime } = require('graphql-iso-date')
    
    const resolvers = {
      /* your other resolvers */
      DateTime: GraphQLDateTime,
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

有关更多详细信息,请参阅文档