aarona
aarona

Reputation: 37303

NodeJS/GraphQL: Trying to use a custom DateTime scalar and I'm getting an error

I'm following a tutorial where the teacher is using a String type for his createdAt fields and suggested that if we wanted, to use a custom scalar type for a stronger typed DateTime field so I'm trying to do just that.

I'm getting the following error: Error: Unknown type "GraphQLDateTime".

Here is the offending code:

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!
  }
`

I have added the graphql-iso-date library and VSCode's intellisense is picking that up so I know that's not the issue. It's also indicating that GraphQLDateTime is not being used anywhere in the file even though I'm referencing it.

I know this is probably an easy fix but I'm still new to NodeJS and GraphQL in the context of NodeJS. Any idea what I'm doing wrong? Also is there another DateTime scalar that might be more preferable (Best practices are always a good idea.) Thanks!

Upvotes: 4

Views: 6501

Answers (1)

Daniel Rearden
Daniel Rearden

Reputation: 84687

There's two steps to adding a custom scalar using apollo-server or graphql-tools:

  1. Add the scalar definition to your type definitions:

    scalar DateTime
    
  2. Add the actual GraphQLScalar to your resolver map:

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

Note that the key in the resolver map (here I used DateTime) has to match whatever you used as the scalar name in Step 1. This will also be the name you use in your type definitions. The name itself is arbitrary, but it needs to match.

See the docs for more details.

Upvotes: 8

Related Questions