Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should I handle a GraphQL ID as a string on the client?

Tags:

I am building an application using:

  • MySQL as the backend database
  • Apollo GraphQL server as a query layer for that database
  • Sequelize as the ORM layer between GraphQL and MySQL

As I am building out my GraphQL schema I'm using the GraphQL ID data type to uniquely identify records. Here's an example schema and its MySQL resolver/connector

Graphql Type:

type Person {   id: ID!   firstName: String   middleName: String   lastName: String   createdAt: String   updatedAt: String } 

Sequelize connector

export const Person = sequelize.define('person', {   firstName: { type: Sequelize.STRING },   middleName: { type: Sequelize.STRING },   lastName: { type: Sequelize.STRING }, }); 

GraphQL resolver:

Query: {   person(_, args) {     return Person.findById(args.id); } 

So that all works. Here's my question. GraphQL seems to treat the ID type as a string. While the ID value gets stored in the MySQL database as an INT by Sequelize. I can use GraphQL to query the MySQL db with either a string or a integer that matches the ID value in the database. However, GraphQL will always return the ID value as a string.

How should I be handling this value in the client? Should I always convert it to an integer as soon as I get it from GraphQL? Should I modify my sequelize code to store the ID value as a string? Is there a correct way to proceed when using GraphQL IDs like this?

like image 553
bryan kennedy Avatar asked Dec 18 '17 18:12

bryan kennedy


People also ask

Can GraphQL ID be String?

GraphQL seems to treat the ID type as a string. While the ID value gets stored in the MySQL database as an INT by Sequelize. I can use GraphQL to query the MySQL db with either a string or a integer that matches the ID value in the database. However, GraphQL will always return the ID value as a string.

Is ID required in GraphQL?

To provide options for GraphQL clients to elegantly handle caching and data refetching, GraphQL servers need to expose object identifiers in a standardized way. For this to work, a client will need to query via a standard mechanism to request an object by ID.

What is the ID type in GraphQL?

ID : The ID scalar type represents a unique identifier, often used to refetch an object or as the key for a cache. The ID type is serialized in the same way as a String; however, defining it as an ID signifies that it is not intended to be human‐readable.


1 Answers

ID is a scalar type described in the GraphQL specification (working draft October 2016):

The ID type is serialized in the same way as a String; however, it is not intended to be human‐readable. While it is often numeric, it should always serialize as a String.


Your observation

I can use GraphQL to query the MySQL db with either a string or a integer that matches the ID value in the database. However, GraphQL will always return the ID value as a string.

is aligned with the specification about result coercion:

GraphQL is agnostic to ID format, and serializes to string to ensure consistency across many formats ID could represent

and input coercion:

When expected as an input type, any string (such as "4") or integer (such as 4) input value should be coerced to ID as appropriate for the ID formats a given GraphQL server expects


How should I be handling this value in the client?

  • When working with ID results, treat them as strings.
  • When using ID inputs (in GraphQL variables or input parameters for mutations or queries), you can either use integers or strings.

Should I always convert it to an integer as soon as I get it from GraphQL?

That's highly depending on your application. There is no general rule that dictates a clear "yes" or "no" here.

Should I modify my sequelize code to store the ID value as a string?

No, that's not required.

The GraphQL specification about the ID type does not cover how you store the ids, only how a GraphQL server is expected to treat ID input and output. It's up to the GraphQL layer to ensure this behaviour. How ids are handled in the actual storage is up to the storage layer.

Is there a correct way to proceed when using GraphQL IDs like this?

I hope the above answers also answer this question :)

like image 189
marktani Avatar answered Sep 19 '22 12:09

marktani