hasura/graphql-engine · error · Error::Connector

{0}

Error message

{0}

What it means

Transparent passthrough variant of the connector client's error enum: a nested ConnectorError is forwarded with its own message unchanged ('{0}'). It represents a structured error response received from the NDC connector over HTTP, distinct from transport-level issues like invalid headers (InvalidHeaderValue) or oversized responses (ResponseTooLarge).

Source

Thrown at v3/crates/execute/src/ndc/client.rs:52

    #[error("unable to decode JSON response from connector: {0}")]
    Serde(#[from] serde_json::Error),

    #[error("UTF-8 error: {0}")]
    Utf8Error(#[from] std::string::FromUtf8Error),

    #[error("IO error: {0}")]
    IOError(#[from] std::io::Error),

    #[error("invalid connector base URL")]
    InvalidBaseURL,

    #[error("invalid header value characters: {0}")]
    InvalidHeaderValue(#[from] reqwest::header::InvalidHeaderValue),

    #[error("response received from connector is too large: {0}")]
    ResponseTooLarge(String),

    #[error("{0}")]
    Connector(ConnectorError),

    #[error("invalid connector error: {0}")]
    InvalidConnector(InvalidConnectorError),

    #[error("Error while executing pre ndc request plugin: {0}")]
    PreNdcRequestPluginError(#[from] pre_ndc_request_plugin::execute::Error),

    #[error("Error while executing pre ndc response plugin: {0}")]
    PreNdcResponsePluginError(#[from] pre_ndc_response_plugin::execute::Error),
}

impl tracing_util::TraceableError for Error {
    fn visibility(&self) -> tracing_util::ErrorVisibility {
        match self {
            // Invalid connector errors with 5xx status codes are considered user errors
            // (connector implementation issues, not engine issues)
            Self::InvalidConnector(InvalidConnectorError { status, .. })

View on GitHub (pinned to 724551b9ae)

Solutions

  1. Read the inner ConnectorError message/response — it is the authoritative cause
  2. Check the connector's own logs for the failing request
  3. Verify metadata matches the connector's current schema and capabilities
  4. Reproduce the request directly against the connector (curl) to isolate engine vs connector
Defensive patterns

Strategy: try-catch

Type guard

fn is_connector_error(e: &ClientError) -> bool { matches!(e, ClientError::Connector(_)) }

Try / catch

Match ClientError::Connector(err) and map err.error_response into the GraphQL error extensions so clients see the connector's structured error; log request_id for tracing.

Prevention

When it happens

Trigger: Any NDC HTTP request to a connector that returns a well-formed error response — the client parses it into ConnectorError and re-exposes it via this transparent variant (e.g. query errors, connector-side validation failures).

Common situations: Connector reports query/capability errors, connector and metadata version mismatch, or the connector backing a data source hits its own internal limits and reports them structurally.

Related errors


AI-assisted analysis of hasura/graphql-engine@724551b9ae (2026-08-28). Data as JSON: /api/errors/44489e9d23b95d27. Report an issue: GitHub.