router icon indicating copy to clipboard operation
router copied to clipboard

Error propagation, missing field response

Open o0Ignition0o opened this issue 3 years ago • 0 comments

I just tried to compare the router and the gateway's behavior if a subgraph returns an error:

CURL command:

curl --request POST \
    --header 'content-type: application/json' \
    --url http://localhost:<ROUTER_OR_GATEWAY_PORT> \
    --data '{"query":"query Me {\n  me {\n    name\n    username\n  }\n}"}' | jq

gateway response:

{
  "errors": [
    {
      "message": "400: Bad Request",
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "response": {
          "url": "http://localhost:8000/",
          "status": 400,
          "statusText": "Bad Request",
          "body": {
            "errors": [
              {
                "message": "Cannot query field \"me\" on type \"Query\".",
                "extensions": {
                  "code": "GRAPHQL_VALIDATION_FAILED",
                  "exception": {
                    "stacktrace": [
                      "GraphQLError: Cannot query field \"me\" on type \"Query\".",
                      "    at Object.Field (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js:51:13)",
                      "    at Object.enter (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/language/visitor.js:301:32)",
                      "    at Object.enter (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/utilities/TypeInfo.js:391:27)",
                      "    at visit (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/language/visitor.js:197:21)",
                      "    at validate (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/validation/validate.js:91:24)",
                      "    at validate (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/apollo-server-core/dist/requestPipeline.js:186:39)",
                      "    at processGraphQLRequest (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/apollo-server-core/dist/requestPipeline.js:98:34)",
                      "    at processTicksAndRejections (node:internal/process/task_queues:96:5)",
                      "    at async processHTTPRequest (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/apollo-server-core/dist/runHttpQuery.js:220:30)"
                    ]
                  }
                }
              }
            ]
          }
        },
        "exception": {
          "stacktrace": [
            "Error: 400: Bad Request",
            "    at RemoteGraphQLDataSource.errorFromResponse (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/datasources/RemoteGraphQLDataSource.js:158:21)",
            "    at RemoteGraphQLDataSource.sendRequest (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/datasources/RemoteGraphQLDataSource.js:98:34)",
            "    at processTicksAndRejections (node:internal/process/task_queues:96:5)",
            "    at async RemoteGraphQLDataSource.process (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/datasources/RemoteGraphQLDataSource.js:73:26)",
            "    at async sendOperation (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/executeQueryPlan.js:225:26)",
            "    at async /Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/executeQueryPlan.js:166:49",
            "    at async executeNode (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/executeQueryPlan.js:129:17)",
            "    at async /Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/executeQueryPlan.js:29:35",
            "    at async /Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/index.js:124:38",
            "    at async execute (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/apollo-server-core/dist/requestPipeline.js:202:20)"
          ]
        }
      }
    }
  ],
  "data": {
    "me": null
  }
}

router response:

{
  "data": null,
  "errors": [
    {
      "message": "Cannot query field \"me\" on type \"Query\".",
      "locations": [],
      "path": null,
      "extensions": {
        "code": "GRAPHQL_VALIDATION_FAILED",
        "exception": {
          "stacktrace": [
            "GraphQLError: Cannot query field \"me\" on type \"Query\".",
            "    at Object.Field (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js:51:13)",
            "    at Object.enter (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/language/visitor.js:301:32)",
            "    at Object.enter (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/utilities/TypeInfo.js:391:27)",
            "    at visit (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/language/visitor.js:197:21)",
            "    at validate (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/validation/validate.js:91:24)",
            "    at validate (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/apollo-server-core/dist/requestPipeline.js:186:39)",
            "    at processGraphQLRequest (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/apollo-server-core/dist/requestPipeline.js:98:34)",
            "    at processTicksAndRejections (node:internal/process/task_queues:96:5)",
            "    at async processHTTPRequest (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/apollo-server-core/dist/runHttpQuery.js:220:30)"
          ]
        }
      }
    }
  ]
}

The "response" field is missing in the router, I suspect it's because of the way we deal with errors in the include_subgraph_errors plugin.

Originally posted by @o0Ignition0o in https://github.com/apollographql/router/issues/1664#issuecomment-1233845525

o0Ignition0o avatar Sep 02 '22 09:09 o0Ignition0o