Start: serverFnFetcher unconditionally console.logs every server-function error, including benign cancellation AbortErrors

Aperta Adatta ai principianti
#7,873 0 commenti 1 reazione 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
76/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Tranquilla
Stack tecnologico
typescript
Ambito
api

Direzione di ricerca

Inizia in packages/start-client-core/src/client-rpc/serverFnFetcher.ts, in getResponse, e ispeziona il blocco catch che registra gli errori che non sono Response. Usa la riproduzione collegata e i passaggi per l'annullamento per verificare il comportamento. Il lavoro è completato quando gli errori delle funzioni server rilanciati, inclusi gli AbortErrors, non producono più il log estraneo nella console.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Which project does this relate to?

Start

Describe the bug

serverFnFetcher's getResponse logs every non-Response error thrown by a server-function call via console.log, then re-throws it. In packages/start-client-core/src/client-rpc/serverFnFetcher.ts:

async function getResponse(fn) {
  let response
  try {
    response = await fn()
  } catch (error) {
    if (error instanceof Response) response = error
    else {
      console.log(error)   // ← logs every error, incl. benign cancellations
      throw error
    }
  }
  // ...
}

Two problems:

  1. It's unconditional — there is no process.env.NODE_ENV guard, so it also runs in production builds (bundlers don't strip console.log by default), spamming the browser console for real users.
  2. It logs benign cancellations. When a caller passes an AbortSignal to a server function and aborts it (e.g. a request cancelled on navigation/unmount), the RPC fetch rejects with DOMException: signal is aborted without reason (AbortError). getResponse console.logs it and re-throws. The
    re-thrown error is then handled by the caller (who deliberately aborted and no longer cares about the result), so the throw itself is fine — but the console.log leaves a stray, stack-trace-bearing console entry with no context.

Because it's console.log (not console.error) on a caught-and-rethrown error, it can't be intercepted from application code: it never reaches a framework error hook or error boundary, and it isn't an unhandled promise rejection, so a window unhandledrejection listener doesn't catch it either.
The only app-side workarounds are monkey-patching console or patching the package.

Complete minimal reproducer

https://codesandbox.io/p/devbox/condescending-diffie-z59y9f

Steps to Reproduce the Bug
  1. Start Dev Server
  2. Open preview browser.
  3. Click the button
  4. examine browser dev console logs
Expected behavior

Cancelling a server-function call should not log to the console. More generally, getResponse should not console.log errors it re-throws — the caller is responsible for handling and reporting them. At minimum the log should be removed; if diagnostic logging is intended, gate it behind
process.env.NODE_ENV !== 'production' and skip cancellation errors (AbortError / CancelledError).

Screenshots or Videos

No response

Platform
  • @tanstack/react-start 1.168.30 (@tanstack/start-client-core 1.170.13)
  • React 19, Vite 8
  • Browser: Chrome (reproduces in both dev and production builds)
Additional context

No response

Lingua principale
TypeScript
Stelle
15.1k
Fork
1.9k
Merge medio
1g 19h
PR unite (30g)
136

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di TanStack/router

Tutte le issue di TanStack/router

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.