# 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** : ```typescript import https from 'https' import http from 'http' import { URL } from 'url' ``` - **Imports supprimés** : ```typescript 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