Files
pagodera/docs/ERRO_DECIMAL_EXPLICACAO.md
T
Evandro Fonseca Junior 7f42def478 feat(market): add Minha Intenções tab with panel, hook, and badge
- Introduced "Minhas Intenções" tab visible only to logged-in users.
- Integrated MyPurchaseIntentionsPanel and useMyPurchaseIntentions hook.
- Added tab badge showing count of pending intentions.
- Extended session API to include user’s main character for downstream features.
2025-11-07 17:25:51 -03:00

4.8 KiB

🔍 Análise dos Erros Encontrados

📋 Problemas Identificados

1. ❌ Erro: "Decimal objects are not supported" (Linha 77-78)

Causa:

  • O Prisma retorna campos Decimal (PostgreSQL) como objetos Prisma.Decimal, não como números JavaScript
  • O Next.js não consegue serializar objetos Decimal ao passar dados de Server Components para Client Components
  • Apenas objetos "plain" (números, strings, arrays, objetos simples) podem ser serializados

Campos afetados:

  • price_pix (Decimal)
  • current_bid_amount (Decimal)
  • min_bid_increment (Decimal)
  • initial_price_pix (Decimal)

Solução aplicada: ✅ Converter todos os campos Decimal para number usando Number() antes de retornar os dados


2. ⚠️ Warning: "Package postcss can't be external" (Linhas 15-20, 85-90, etc.)

Causa:

  • Dependência transitiva (sanitize-html → postcss) não está instalada diretamente
  • Next.js/Turbopack tenta externalizar o pacote mas não consegue resolvê-lo

Impacto:

  • ⚠️ Apenas um warning, não quebra a aplicação
  • Pode causar problemas em builds de produção

Soluções possíveis:

  1. Instalar postcss diretamente (recomendado):

    pnpm add postcss
    
  2. Adicionar ao package.json explicitamente:

    "dependencies": {
      "postcss": "^8.4.0"
    }
    

3. ✅ Erro resolvido: "column does not exist" (Linha 45)

Status: ✅ RESOLVIDO

  • A migração 014 foi executada com sucesso
  • As colunas min_bid_increment, initial_price_pix, etc. foram adicionadas
  • O erro não aparece mais nos logs recentes (linhas 75-76, 115-116 mostram queries funcionando)

🔧 Correções Implementadas

Arquivo: lib/prisma/queries/listings.ts

Antes:

return {
  ...listing,
  price_gold_coins: listing.price_gold_coins ? Number(listing.price_gold_coins) : null,
  // ❌ Campos Decimal não eram convertidos
};

Depois:

// Converter todos os campos Decimal e BigInt para números JavaScript
return {
  ...listing,
  price_pix: listing.price_pix ? Number(listing.price_pix) : null,
  current_bid_amount: listing.current_bid_amount ? Number(listing.current_bid_amount) : null,
  min_bid_increment: listing.min_bid_increment ? Number(listing.min_bid_increment) : null,
  initial_price_pix: listing.initial_price_pix ? Number(listing.initial_price_pix) : null,
  price_gold_coins: listing.price_gold_coins ? Number(listing.price_gold_coins) : null,
  initial_price_gold_coins: listing.initial_price_gold_coins ? Number(listing.initial_price_gold_coins) : null,
  seller_character_name: character?.character_name || null,
} as Listing;

Funções corrigidas:

  • ✅ createListing()
  • ✅ getListingById()
  • ✅ getListings()
  • ✅ updateListing()
  • ✅ placeBid()

📊 Resultado

✅ Resolvido:

  1. Erro de coluna não existente (migração executada)
  2. Erro de serialização Decimal (conversão implementada)

⚠️ Pendente (não crítico):

  1. Warning do postcss (pode ser ignorado ou resolvido instalando postcss)

🎯 Próximos Passos Recomendados

  1. Instalar postcss (opcional, resolve warning):

    pnpm add postcss
    
  2. Testar a aplicação:

    • Verificar se a página do marketplace carrega corretamente
    • Verificar se os preços são exibidos corretamente
    • Testar criação de anúncios
    • Testar leilões e lances
  3. Monitorar logs:

    • Verificar se o erro "Decimal objects are not supported" não aparece mais
    • Verificar se as queries estão funcionando corretamente

🔍 Por que isso acontece?

Prisma + PostgreSQL + Decimal

O Prisma usa o tipo Decimal do Prisma para representar valores DECIMAL do PostgreSQL. Isso garante precisão decimal, mas cria objetos que não são serializáveis pelo React/Next.js.

Fluxo do problema:

PostgreSQL DECIMAL → Prisma.Decimal → ❌ Não serializável → Erro no React

Solução:

PostgreSQL DECIMAL → Prisma.Decimal → Number() → ✅ number (serializável)

Serialização no Next.js

O Next.js precisa serializar dados ao passar de Server Components para Client Components. Ele usa JSON serialization, que não suporta:

  • Classes customizadas
  • Objetos Decimal do Prisma
  • Funções
  • Símbolos
  • etc.

Apenas tipos primitivos JSON são suportados:

  • ✅ string, number, boolean
  • ✅ null, undefined
  • ✅ Arrays e objetos simples

📚 Referências