65 lines
3.1 KiB
Markdown
65 lines
3.1 KiB
Markdown
# 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
|
|
|