CSV-Dateien über eine REST API hochladen und verarbeiten
Das Hochladen und Verarbeiten von CSV-Dateien über eine REST API ist eine gängige Anforderung in modernen Webanwendungen. In dieser Anleitung zeigen wir Ihnen, wie Sie mit Node.js und Express eine sichere REST API erstellen, die CSV-Datei-Uploads verarbeitet, Dateiinhalte mithilfe von csv-parser parst und die Daten für den späteren Abruf speichert. Multer setzen wir ein, um Datei-Uploads mit robusten Sicherheitsprüfungen zu verwalten.
Voraussetzungen
Stellen Sie vor dem Start sicher, dass Folgendes installiert ist:
- Node.js (Version 22.x LTS oder höher)
- npm (Node Package Manager)
Einen Node.js- und Express-Server einrichten
-
Erstellen Sie ein neues Verzeichnis für Ihr Projekt und initialisieren Sie es:
mkdir csv-upload-api cd csv-upload-api npm init -y -
Installieren Sie die erforderlichen Abhängigkeiten mit explizit angegebenen Versionsnummern, um die Kompatibilität sicherzustellen:
npm install express@4.22.2 multer@2.3.0 csv-parser@3.2.0 -
Erstellen Sie eine Datei mit dem Namen
server.jsund fügen Sie den folgenden Code hinzu, um einen einfachen Express-Server einzurichten:const express = require('express') const app = express() const port = process.env.PORT || 3000 app.use(express.json()) app.listen(port, () => { console.log(`Server is running on port ${port}`) })
Den Datei-Upload-Endpunkt implementieren
Fügen Sie den folgenden Code in server.js vor app.listen ein. Konfigurieren Sie Multer mit einer
Dateigrößenbegrenzung und einem Filter für CSV-Dateinamen und MIME-Typen. Beide Angaben stammen vom
Client, daher ist dieser Filter nur eine erste Prüfung; das Parsen und eine anwendungsspezifische
Validierung der Zeilen sind weiterhin erforderlich.
const multer = require('multer')
const path = require('path')
const fs = require('fs')
const csv = require('csv-parser')
const { pipeline } = require('node:stream/promises')
const upload = multer({
dest: 'uploads/',
limits: { fileSize: 1024 * 1024 * 5, files: 1, fields: 0 }, // 5 MiB limit
fileFilter: (req, file, cb) => {
if (file.mimetype !== 'text/csv' || path.extname(file.originalname).toLowerCase() !== '.csv') {
return cb(Object.assign(new Error('Unsupported file type'), { code: 'UNSUPPORTED_FILE_TYPE' }))
}
cb(null, true)
},
})
CSV-Daten parsen und speichern
In diesem Abschnitt erstellen wir den Endpunkt /upload, um die CSV-Datei zu parsen und ihren Inhalt zu
speichern. Eine globale Variable hält die geparsten Daten vor, und ein GET-Endpunkt stellt sie zum
Abruf bereit. Dies ist eine begrenzte Demonstration in einem einzelnen Prozess: Ein erfolgreicher
Upload ersetzt den vorherigen Datensatz, und ein Neustart löscht ihn. Produktivanwendungen
benötigen eine Autorisierung pro Benutzer und dauerhaften Speicher.
let storedData = []
async function parseUpload(filePath) {
try {
const results = []
await pipeline(
fs.createReadStream(filePath),
csv({ strict: true, maxRowBytes: 1024 * 1024 }),
async (rows) => {
for await (const row of rows) {
results.push(row)
}
},
)
return results
} finally {
await fs.promises.unlink(filePath)
}
}
app.post('/upload', upload.single('file'), async (req, res, next) => {
if (!req.file) {
return res.status(400).send('No file uploaded.')
}
try {
const results = await parseUpload(req.file.path)
storedData = results
res.json({ recordsStored: results.length })
} catch (error) {
next(error)
}
})
app.get('/data', (req, res) => {
res.json(storedData)
})
// Error middleware must follow every route whose errors it handles.
app.use((error, req, res, next) => {
if (res.headersSent) return next(error)
if (error.code === 'UNSUPPORTED_FILE_TYPE') {
return res.status(415).json({ error: 'Only CSV files are accepted.' })
}
if (error instanceof multer.MulterError) {
const status = error.code === 'LIMIT_FILE_SIZE' ? 413 : 400
return res.status(status).json({ error: 'Upload rejected.' })
}
console.error('CSV processing failed')
res.status(500).json({ error: 'Unable to process the upload.' })
})
pipeline leitet Lese- und Parser-Fehler an einen einzigen Error-Handler weiter. Der temporäre Upload
wird sowohl bei Erfolg als auch bei einem Fehler gelöscht, und ein fehlgeschlagenes Parsen ersetzt
niemals den vorherigen Datensatz. Halten Sie Multer gepatcht; Version 2.3.0 enthält die
Sicherheitsfixes vom August 2026.
Die API testen
Sie können die API mit den folgenden cURL-Befehlen oder mit Postman testen.
Testen Sie einen erfolgreichen Upload:
curl --fail-with-body -F "file=@data.csv;type=text/csv" http://localhost:3000/upload
Testen Sie mit einem ungültigen Dateityp:
curl -X POST -F "file=@image.jpg" http://localhost:3000/upload
Testen Sie die Überschreitung der Dateigrößenbegrenzung:
curl --fail-with-body -F "file=@large.csv;type=text/csv" http://localhost:3000/upload
Rufen Sie die gespeicherten Daten ab:
curl http://localhost:3000/data
Alternativ können Sie Postman verwenden: Setzen Sie die Anfragemethode auf POST und die URL auf
http://localhost:3000/upload und wählen Sie im Tab „Body“ die Option „form-data“ aus. Fügen Sie einen Schlüssel
mit dem Namen file und dem Typ File hinzu, wählen Sie Ihre CSV-Datei aus und senden Sie Ihre Anfrage.
Überlegungen für den Produktivbetrieb
Beachten Sie vor dem Deployment diese wichtigen bewährten Verfahren:
- Verwenden Sie Umgebungsvariablen für die Konfiguration (etwa für Portnummern und Upload-Limits).
- Implementieren Sie ein sauberes Logging mit einem produktionsreifen Logger.
- Versehen Sie Upload-Endpunkte mit Rate Limiting, um Missbrauch zu verhindern.
- Ziehen Sie Cloud-Storage-Dienste (z. B. AWS S3 oder Google Cloud Storage) anstelle des lokalen Dateisystems in Betracht.
- Implementieren Sie eine robuste Authentifizierung und Autorisierung für zusätzliche Sicherheit.
- Verwenden Sie HTTPS, um im Produktivbetrieb die gesamte Kommunikation abzusichern.
- Überwachen Sie die Serverressourcen und planen Sie geeignete Skalierungsstrategien.
Fazit
Diese Anleitung hat gezeigt, wie Sie mit Node.js und Express eine sichere REST API zum Hochladen und Verarbeiten von CSV-Dateien erstellen. Durch die Kombination von Multer für die sichere Dateiverarbeitung mit csv-parser für die Datenextraktion verarbeitet die API CSV-Uploads effizient und bietet zugleich eine robuste Fehlerbehandlung. Wenn Sie weitere Lösungen für Skalierbarkeit suchen, werfen Sie einen Blick auf die Dienste zur Dateiverarbeitung von Transloadit.
