Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

`void/log` serializes `Error` fields as `{}`, losing message and stack

Chiusa Adatta ai principianti
#577 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Una pull request collegata è già stata integrata.

  • #583 di @RaphaelFakhri — integrata

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
75/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
typescript
Ambito
backend

Direzione di ricerca

Inizia individuando la chiamata esistente a JSON.stringify in format() e controlla come vengono assemblati i campi del logger e come sono coperti dai test. Verifica come vengono serializzati i valori Error, inclusi gli errori annidati, le catene di cause e i campi personalizzati come status; il lavoro è completato quando i log conservano questi dettagli mantenendo la struttura di payload esistente e il ripiego per i riferimenti circolari.

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

Descrizione

Summary

logger.error() is meant for surfacing caught errors (#168), but an Error passed as a field is logged as {}. Its message, stack and cause are non-enumerable, so JSON.stringify drops them. Nothing fails, so this goes unnoticed until someone needs the log.

Reproduction

[email protected] (same code on main):

import { logger } from 'void/log';

logger.error('save failed', { error: new Error('boom') });
// {"msg":"save failed","error":{}}

logger.error('save failed', { error: new Error('wrapped', { cause: new Error('inner') }) });
// {"msg":"save failed","error":{}}

class AppError extends Error {
  status = 500;
}
logger.error('save failed', { error: new AppError('boom') });
// {"msg":"save failed","error":{"status":500}}

Expected

The error's details are kept, for example:

{"msg":"save failed","error":{"name":"Error","message":"boom","stack":"Error: boom\n    at ..."}}

Suggested fix

Pass a replacer to the existing JSON.stringify call in format(). This also covers nested errors and cause chains, keeps custom enumerable fields such as status, and leaves the { msg, ...fields } shape unchanged:

function replacer(_key: string, value: unknown) {
  if (value instanceof Error) {
    return { ...value, name: value.name, message: value.message, stack: value.stack, cause: value.cause };
  }
  return value;
}

return JSON.stringify(payload, replacer);

The existing catch fallback still handles circular references.

If passing Error objects is intentionally unsupported, a note in the logger docs to pass error.message / error.stack as strings would help.

Lingua principale
TypeScript
Stelle
627
Fork
66
Merge medio
12h 56m
PR unite (30g)
162

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

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 voidzero-dev/void

Tutte le issue di voidzero-dev/void

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.