Skip to content

Error tracking for errors in defer #7671

Open
@hanayashiki

Description

@hanayashiki

What version of Remix are you using?

1.19.0

Are all your remix dependencies & dev-dependencies using the same version?

  • Yes

Steps to Reproduce

// routes/stream-error.ts

import { Suspense } from "react";

import { defer } from "@remix-run/node";
import { Await, useLoaderData } from "@remix-run/react";

export const loader = async ({}) => {
  return defer({
    data: (async () => {
      await new Promise((r) => setTimeout(r, 1000));

      throw new Error("dev stream error");
    })(),
  });
};

export default function DevStreamError() {
  const { data } = useLoaderData<typeof loader>();

  return (
    <div>
      test
      <Suspense fallback={"loading"}>
        <Await resolve={data}>{() => "loaded"}</Await>
      </Suspense>
    </div>
  );
}
// entry.server.ts

export function handleError(
  error: unknown,
  { request }: DataFunctionArgs,
): void {
  console.log("handleError in entry.server.ts");
  if (error instanceof Error) {
    captureRemixServerException(error, "remix.server", request);
  } else {
    // Optionally capture non-Error objects
    captureException(error);
  }
}

Expected Behavior

Maybe handleError should be invoked? Or any another handleDeferError function should be invoked?

I am currently unable to do anything for errors thrown in defer promises, unless I wrap them one by one with some custom error handling logics.

This problem is not discussed as far as I know. How do people track issues in defer?

ErrorBoundary doesn't help, because in production mode all error stack information invisible to client, let alone there is loss of information if not tracked on server.

Actual Behavior

handleError is not invoked for any error in defer

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions