3.1 KiB
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'APIgetHeaders()pour obtenir les headers avec le boundaryfetch()natif de Node.js attend le FormData du web standard (disponible dans le navigateur), pas le package npmform-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
- Remplacement de
fetch()natif par les modules natifshttpsethttpde Node.js - Utilisation de
form-data.pipe()pour envoyer les données via les modules natifs - 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()ouhttp.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
- Les modifications sont dans le code source
- Rebuild de l'application :
npm run build - Redémarrage du service Next.js
- 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 :
- Vérifier les logs du serveur pour les erreurs liées à
form-dataoufetch - Tester l'upload via l'interface utilisateur
- Vérifier les logs de la console navigateur pour les erreurs 500
- Vérifier que
form-data(npm) est utilisé avechttps/httpnatif, pas avecfetch()
Notes
- Le package
form-data(npm) doit être utilisé avec les moduleshttps/httpnatifs de Node.js, pas avecfetch() fetch()natif de Node.js est compatible avec FormData du web standard (disponible dans le navigateur), pas avec le package npmform-data- Les fichiers temporaires créés par formidable doivent être nettoyés même en cas d'erreur pour éviter l'accumulation de fichiers