story-research-zapwall/fixKnowledge/nip95-upload-500-error.md
Nicolas Cantu 065ab30828 Fix: favicon 404 error and NIP-95 upload 500 error
**Motivations:**
- Corriger l'erreur 404 pour favicon.ico demandé par les navigateurs
- Corriger l'erreur 500 de l'API NIP-95 upload empêchant les uploads de fichiers

**Root causes:**
- Fichier favicon.ico manquant dans public/ causant des erreurs 404 répétées
- Incompatibilité entre form-data (npm) et fetch() natif de Node.js dans l'API NIP-95

**Correctifs:**
- Ajout de favicon.svg et mise à jour des références dans les pages
- Remplacement de fetch() par https/http natifs de Node.js dans nip95-upload.ts
- Amélioration de la gestion des erreurs et nettoyage des fichiers temporaires

**Evolutions:**
- Documentation des problèmes et solutions dans fixKnowledge/

**Pages affectées:**
- components/HomeView.tsx
- pages/docs.tsx
- pages/presentation.tsx
- pages/api/nip95-upload.ts
- features/account-creation-buttons-separation.md
- fixKnowledge/favicon-404-error.md (nouveau)
- fixKnowledge/nip95-upload-500-error.md (nouveau)
- public/favicon.svg (nouveau)
2026-01-05 01:34:55 +01:00

3.1 KiB

Problème : API NIP-95 upload retourne 500

Date

2025-01-27

Problème

L'endpoint API /api/nip95-upload retournait une erreur 500 lors des tentatives d'upload de fichiers via NIP-95.

Symptômes

  • Erreur 500 lors des appels à /api/nip95-upload?endpoint=https://void.cat/upload
  • Console navigateur : Failed to load resource: the server responded with a status of 500 ()
  • Console navigateur : NIP-95 upload endpoint error: Object
  • Les uploads NIP-95 échouaient systématiquement

Root cause

Le package npm form-data n'est pas compatible avec fetch() natif de Node.js (Node 18+). L'API utilisait form-data de npm avec fetch() natif, ce qui causait une incompatibilité car :

  • form-data (npm) utilise des streams Node.js natifs et l'API getHeaders() pour obtenir les headers avec le boundary
  • fetch() natif de Node.js attend le FormData du web standard (disponible dans le navigateur), pas le package npm form-data
  • Cette incompatibilité provoquait une erreur lors de l'exécution de la requête HTTP

Impact

  • Impossible d'uploader des fichiers via NIP-95
  • Les utilisateurs ne pouvaient pas publier d'articles avec des médias
  • Fonctionnalité d'upload complètement non fonctionnelle

Correctifs

  1. Remplacement de fetch() natif par les modules natifs https et http de Node.js
  2. Utilisation de form-data.pipe() pour envoyer les données via les modules natifs
  3. Gestion correcte des erreurs et nettoyage des fichiers temporaires dans tous les cas

Modifications

  • Fichier modifié : pages/api/nip95-upload.ts
  • Imports ajoutés :
    import https from 'https'
    import http from 'http'
    import { URL } from 'url'
    
  • Imports supprimés :
    import { Readable } from 'stream' // Non utilisé
    
  • Remplacement de fetch() : Utilisation de https.request() ou http.request() selon le protocole de l'URL cible
  • Gestion des erreurs améliorée : Nettoyage des fichiers temporaires même en cas d'erreur de requête
  • Gestion des streams : Utilisation de formData.pipe(proxyRequest) pour envoyer les données

Modalités de déploiement

  1. Les modifications sont dans le code source
  2. Rebuild de l'application : npm run build
  3. Redémarrage du service Next.js
  4. Aucune dépendance supplémentaire nécessaire (utilisation des modules natifs Node.js)

Modalités d'analyse

Pour vérifier si le problème existe :

  1. Vérifier les logs du serveur pour les erreurs liées à form-data ou fetch
  2. Tester l'upload via l'interface utilisateur
  3. Vérifier les logs de la console navigateur pour les erreurs 500
  4. Vérifier que form-data (npm) est utilisé avec https/http natif, pas avec fetch()

Notes

  • Le package form-data (npm) doit être utilisé avec les modules https/http natifs de Node.js, pas avec fetch()
  • fetch() natif de Node.js est compatible avec FormData du web standard (disponible dans le navigateur), pas avec le package npm form-data
  • Les fichiers temporaires créés par formidable doivent être nettoyés même en cas d'erreur pour éviter l'accumulation de fichiers