Type-graphql: formatArgumentValidationError causing typescript error

Created on 22 Feb 2019  ยท  18Comments  ยท  Source: MichalLytek/type-graphql

Following along with @benawad fantastic tutorial. On the validation video.

I'm running into an issue when attempting to use formatArgumentValidationError.

import { ApolloServer } from 'apollo-server-express';
import Express from 'express';
import 'reflect-metadata';
import { buildSchema, formatArgumentValidationError } from 'type-graphql';
import { createConnection } from 'typeorm';

import { RegisterResolver } from './modules/user/Register';

const main = async () => {
  await createConnection();

  const schema = await buildSchema({
    resolvers: [RegisterResolver]
  });

  const apolloServer = new ApolloServer({ schema, formatError: formatArgumentValidationError });

  const app = Express();

  apolloServer.applyMiddleware({ app });

  app.listen(4000, () => {
    // tslint:disable-next-line:no-console
    console.log('Server started on http://localhost:4000/graphql');
  });
};

// tslint:disable-next-line:no-floating-promises
main(); 

This is resulting in the TS error below

$ ts-node-dev --respawn src/index.ts
Using ts-node version 8.0.2, typescript version 3.3.3333
[ERROR] 09:59:16 โจฏ Unable to compile TypeScript:
src/index.ts(16,51): error TS2322: Type '(err: GraphQLError) => { [key: string]: any; }' is not assignable to type '(error: GraphQLError) => GraphQLFormattedError'.
  Type '{ [key: string]: any; }' is missing the following properties from type 'GraphQLFormattedError': message, locations, path

I haven't seen anyone else complain of this, so it feels like an issue with my setup. But I cannot for the life of me figure out why I am getting it while no one else is.

Bug Community Solved

Most helpful comment

@venatir Please check twice before starting to complain:

opera_2020-02-12_20-02-39-2

It was clearly released as the new major version with a "breaking change" notice ๐Ÿ˜ 

All 18 comments

Hi @jansselt, the typings of formatError have been updated on version 2.4.3 of apollo-server-express. Version 2.4.2 works ๐Ÿ‘

Alright, will downgrade for now until this is updated to coincide. Thanks @vfaramond . Was going crazy.

@19majkel94, sorry for creating duplicate. Do we plan fix this issue?

There is a lot of weird type changes in apollo-server right now:
https://github.com/apollographql/apollo-server/pull/2346

I will wait for it to settle down and then re-investigate whether it really changed the signature or the API.

In the meantime, this is the custom implementation of formatError I use with the last version (2.4.6) of apollo-server-express:

formatError: (error: GraphQLError): GraphQLFormattedError => {
  if (error.originalError instanceof ApolloError) {
    return error;
  }

  if (error.originalError instanceof ArgumentValidationError) {
    const { extensions, locations, message, path } = error;

    error.extensions.code = 'GRAPHQL_VALIDATION_FAILED';

    return {
      extensions,
      locations,
      message,
      path,
    };
  }

  error.message = 'Internal Server Error';

  return error;
}

Basically, looks like in new ApolloServer the formatArgumentValidationError is not needed anymore as the original error is reflected in extensions:

{
  "errors": [
    {
      "message": "Argument Validation Error",
      "locations": [
        {
          "line": 22,
          "column": 3
        }
      ],
      "path": [
        "addRecipe"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "validationErrors": [
            {
              "target": {
                "title": "Correct title",
                "description": "Too short description"
              },
              "value": "Too short description",
              "property": "description",
              "children": [],
              "constraints": {
                "length": "description must be longer than or equal to 30 characters"
              }
            }
          ],
          "stacktrace": [
            "Error: Argument Validation Error",
            "    at Object.<anonymous> (F:\\#Projekty\\type-graphql\\src\\resolvers\\validate-arg.ts:29:11)",
            "    at Generator.throw (<anonymous>)",
            "    at rejected (F:\\#Projekty\\type-graphql\\node_modules\\tslib\\tslib.js:105:69)",
            "    at processTicksAndRejections (internal/process/next_tick.js:81:5)"
          ]
        }
      }
    }
  ],
  "data": null
}

I've tested that so I will remove the formatArgumentValidationError at all as it's not needed anymore. The first version of ApolloServer, as well as GraphQLYoga, stripped off additional properties, so I had to provide a format helper for that:

{
  "errors": [
    {
      "message": "Argument Validation Error",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": ["addRecipe"]
    }
  ],
  "data": null
}

Fixed via 526886c ๐Ÿ”’

Released in 0.17.0-beta.9 ๐ŸŽ‰

It probably doesn't works for validation in nested objects. ๐Ÿ˜ž

@Myiyk See #133 - nested inputs are not an instance, so they can't be validated using class-validator. It's not a format error fault.

@git-no
Please read this thread once more - this helper was removed.

You can't simply remove functionality. This is a breaking change.
Please either maintain compatibility with previous minor versions or bump the major.

@venatir Please check twice before starting to complain:

opera_2020-02-12_20-02-39-2

It was clearly released as the new major version with a "breaking change" notice ๐Ÿ˜ 

@venatir, hello my friend.

The package is released as 0.x version, so minor version can have breaking changes. Proof

@galkin Oh, you think it's the source of confusion.

Basically major 0 release has a different semver:
0.MAJOR.MINOR
so there is no patch releases.

image

At least that's the way npm handles deps ๐Ÿ˜‰

My bad. Was aware of the above (0 Major different behaviour), but I read the version from a different package (apollo-server-core) and somehow was convinced this was v2.10.0 :) Please ignore me :) Either way it's great too see you guys are so active and answer this fast. Great maintenance work!

In the meantime, this is the custom implementation of formatError I use with the last version (2.4.6) of apollo-server-express:

formatError: (error: GraphQLError): GraphQLFormattedError => {
  if (error.originalError instanceof ApolloError) {
    return error;
  }

  if (error.originalError instanceof ArgumentValidationError) {
    const { extensions, locations, message, path } = error;

    error.extensions.code = 'GRAPHQL_VALIDATION_FAILED';

    return {
      extensions,
      locations,
      message,
      path,
    };
  }

  error.message = 'Internal Server Error';

  return error;
}

I can confirm this works however add the following lines to your code:

import {  GraphQLError, GraphQLFormattedError } from 'graphql';
import { ApolloError } from 'apollo-server-express';
import { ArgumentValidationError } from 'type-graphql';

....ts

if (error && error.extensions) {
        error.extensions.code = 'GRAPHQL_VALIDATION_FAILED';
    }

....

return error;

for newcommer from this toutorial u van add this

import {  GraphQLError, GraphQLFormattedError } from 'graphql';
import { ApolloError } from 'apollo-server-express';
import { ArgumentValidationError } from 'type-graphql';


  const apolloserver = new ApolloServer({
    schema, formatError: (error: GraphQLError): GraphQLFormattedError => {
      if (error && error.extensions) {
        error.extensions.code = 'GRAPHQL_VALIDATION_FAILED';
      }
      return error;
    }
  });
Was this page helpful?
0 / 5 - 0 ratings

Related issues

reilem picture reilem  ยท  3Comments

Janushan picture Janushan  ยท  3Comments

itsgracian picture itsgracian  ยท  3Comments

avkonst picture avkonst  ยท  3Comments

MichalLytek picture MichalLytek  ยท  3Comments