facebook/relay · error

Relay: Received a field error in the server response for fie

Error message

Relay: Received a field error in the server response for field '${fieldError.fieldPath}' in '${fieldError.owner}'. Message: ${fieldError.error.message}

What it means

handleFieldErrors throws for 'relay_field_payload.error' events: the server response itself contained an error for a field (typical GraphQL errors array with data:null paths), and Relay is surfacing it when the snapshot/error disposition requests throwing. The message carries the field path, owner operation, and server message.

Source

Thrown at packages/relay-runtime/util/handlePotentialSnapshotErrors.js:52

    // passing the event through.

    environment.relayFieldLogger({
      // the uiContext on fieldError undefined *always*,
      ...fieldError,
      // and this is where we assign loggingContext to uiContext to populate it
      uiContext: loggingContext,
    });
  }

  for (const fieldError of fieldErrors) {
    if (eventShouldThrow(fieldError)) {
      switch (fieldError.kind) {
        case 'relay_resolver.error':
          throw new Error(
            `Relay: Resolver error at path '${fieldError.fieldPath}' in '${fieldError.owner}'. Message: ${fieldError.error.message}`,
          );
        case 'relay_field_payload.error':
          throw new Error(
            `Relay: Received a field error in the server response for field '${fieldError.fieldPath}' in '${fieldError.owner}'. Message: ${fieldError.error.message}`,
          );
        case 'missing_expected_data.throw':
          throw new Error(
            `Relay: Missing expected data at path '${fieldError.fieldPath}' in '${fieldError.owner}'. See https://relay.dev/docs/next/debugging/why-null/ for likely causes.`,
          );
        case 'missing_required_field.throw': {
          let reason: string;
          if (fieldError.fieldValue === null) {
            reason =
              fieldError.fieldError != null
                ? `the server returned null with an error: ${fieldError.fieldError.message}`
                : 'the server returned null';
          } else {
            reason =
              'the field was missing in the store (data may not have been fetched, or was removed by a graph relationship change: https://relay.dev/docs/next/debugging/why-null/#graph-relationship-change)';
          }
          throw new Error(

View on GitHub (pinned to 668b1b85e0)

Solutions

  1. Fix or tolerate the server field error — check fieldPath to see which field failed and handle nulls in the fragment
  2. Wrap the query in an ErrorBoundary / catch around environment.lookup and render a fallback
  3. Adjust the throw disposition (remove @throwOnFieldError) so the error is logged via relayFieldLogger instead of thrown
  4. Update the server resolver or schema so the field doesn't error for this query shape

Example fix

// before
const data = useLazyLoadQuery(Query, vars); // throws on field payload error
// after
<ErrorBoundary fallback={<ErrorView/>}>
  <ComponentUsingQuery/>
</ErrorBoundary>
Defensive patterns

Strategy: try-catch

Validate before calling

null

Type guard

null

Try / catch

try {
  const data = useLazyLoadQuery(Query, vars);
} catch (e) {
  if (String(e.message).startsWith('Relay: Received a field error')) {
    return <FieldErrorView error={e}/>;
  }
  throw e;
}

Prevention

When it happens

Trigger: A GraphQL response includes field-level errors (e.g. non-null field resolution failure server-side) while reading data whose event disposition is throw (e.g. @throwOnFieldError, or missing_expected_data.throw style policies on the read).

Common situations: Server-side resolver failures for nullable/non-null fields; network layer returning partial data plus errors; tests simulating error responses; missing error handling on the network layer that would otherwise normalize errors.

Related errors


AI-assisted analysis of facebook/relay@668b1b85e0 (2026-09-02). Data as JSON: /api/errors/4c3bd6c70ba3cbfe. Report an issue: GitHub.