Giter VIP home page Giter VIP logo

Comments (5)

dmitshur avatar dmitshur commented on July 28, 2024 1

@mwilli31 I've sent PR #23 which should fix this issue. Could you give it a try and confirm it fixes it for you?

from graphql.

dmitshur avatar dmitshur commented on July 28, 2024

Hi, thanks for reporting.

Minor bug where the response from the server is not compliant with the Query Struct and provides valid graphql Errors

I'd like to better understand when this can happen (and why):

  • Can it happen with a valid GraphQL server, or only if the GraphQL server sends an response that isn't correct according to the GraphQL spec?

  • Do you know what are the conditions for this to happen?

  • How can I reproduce it?

Thanks.

from graphql.

mwilli31 avatar mwilli31 commented on July 28, 2024

If an error was encountered before execution begins, the data entry should not be present in the result.

If an error was encountered during the execution that prevented a valid response, the data entry in the response should be null.

This is happening with a valid GraphQL server and fails while in compliance with the above spec. Essentially, the has to do with the UnmarshalGraphQL function:

func UnmarshalGraphQL(data []byte, v interface{}) error {
	dec := json.NewDecoder(bytes.NewReader(data))
	dec.UseNumber()
	err := (&decoder{tokenizer: dec}).Decode(v)
	if err != nil {
		//ERROR IS THROWN HERE HERE
		return err
	}

To reproduce, send a query that has an error that returns a NULL entity back (like an ID lookup that has no resource found).

Example return from GraphiQL:

{
  "data": {
    "clinicalCodeType": null
  },
  "errors": [
    {
      "message": "Resource Not Found",
      "path": [
        "clinicalCodeType"
      ]
    }
  ]
}

Also, it fails when the query doesn't match a valid query and fails before execution begins on the server (ie. missing required fields).

Example return from Graphiql:

{
  "errors": [
    {
      "message": "Field \"clinicalCodeType\" argument \"id\" of type \"String!\" is required but not provided.",
      "locations": [
        {
          "line": 29,
          "column": 3
        }
      ]
    }
  ]
}

Tracing it into the UnmarshalGraphQL function, it fails because the "data" element returned by the GraphQL Server is either NULL or non-existent and thus its trying to unmarshal an object that doesn't exist and throws an error.

from graphql.

dmitshur avatar dmitshur commented on July 28, 2024

Thanks a lot for the information, it's very helpful.

I will work on a fix.

I suspect the right solution is that UnmarshalGraphQL should not return an error on that input. It should populate partial results (if any) and return nil error.

Just checking, but are you using the latest version of graphql? I remember fixing an issue related to this somewhat recently (edit: see 8d3d310).

from graphql.

dmitshur avatar dmitshur commented on July 28, 2024

@mwilli31 Can you share the GraphQL query and/or the Go code to execute that query that you used? I can't reproduce the problem yet.

Edit: Okay, I managed to reproduce when "data" field is completely absent from the response.

from graphql.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.