Zum Inhalt

5.5 Erstellung CRUD Handlers für das eigene Projekt

Ziel

Sie können eine CRUD API ohne Datenbankanbindung mit Hilfe von JSON erstellen.

Aufgabe

Auf Grundlage der Theorie wird eine API gebaut, welche Daten erstellen, löschen, lesen und updaten (CRUD) kann. Da nur mit einem JSON gearbeitet wird, müssen die Daten nicht wirklich aus einer Datenbank gelöscht werden – das kommt später. Der Code wurde auf den Raspberry Pi transferiert.


Fixture-Daten auf dem Raspberry Pi

Die folgende Abbildung zeigt die laufende API mit den Fixture-Daten unter GET /api/v1/cars:

cars API auf dem Raspberry Pi

alt text

Umsetzung

Create-Handler (POST)

POST /api/v1/cars
Content-Type: application/json

Der Create-Handler nimmt einen neuen Datensatz entgegen und fügt ihn dem JSON-Array hinzu.

app.post('/api/v1/cars', (req, res) => {
  const newItem = req.body;
  cars.push(newItem);
  res.status(201).json({ status: 'success', data: newItem });
});

Read-Handler (GET)

GET /api/v1/cars
GET /api/v1/cars/:id

Der Read-Handler gibt alle Datensätze oder einen spezifischen Eintrag anhand der ID zurück.

app.get('/api/v1/cars', (req, res) => {
  res.json({ status: 'success', results: cars.length, data: { cars } });
});

app.get('/api/v1/cars/:id', (req, res) => {
  const item = cars.find(f => f.id === parseInt(req.params.id));
  if (!item) return res.status(404).json({ status: 'fail', message: 'Not found' });
  res.json({ status: 'success', data: { fixture: item } });
});

Update-Handler (PUT)

PUT /api/v1/cars/:id
Content-Type: application/json

Der Update-Handler ersetzt einen bestehenden Datensatz vollständig.

app.put('/api/v1/cars/:id', (req, res) => {
  const index = cars.findIndex(f => f.id === parseInt(req.params.id));
  if (index === -1) return res.status(404).json({ status: 'fail', message: 'Not found' });
  cars[index] = { id: parseInt(req.params.id), ...req.body };
  res.json({ status: 'success', data: { fixture: cars[index] } });
});

Patch-Handler (PATCH)

PATCH /api/v1/cars/:id
Content-Type: application/json

Der Patch-Handler aktualisiert nur die übermittelten Felder eines Datensatzes, ohne den Rest zu überschreiben.

app.patch('/api/v1/cars/:id', (req, res) => {
  const index = cars.findIndex(f => f.id === parseInt(req.params.id));
  if (index === -1) return res.status(404).json({ status: 'fail', message: 'Not found' });
  cars[index] = { ...cars[index], ...req.body };
  res.json({ status: 'success', data: { fixture: cars[index] } });
});

Delete-Handler (DELETE)

DELETE /api/v1/cars/:id

Der Delete-Handler entfernt einen Datensatz anhand der ID aus dem JSON-Array. Da keine echte Datenbank verwendet wird, reicht ein splice auf das Array.

app.delete('/api/v1/cars/:id', (req, res) => {
  const index = cars.findIndex(f => f.id === parseInt(req.params.id));
  if (index === -1) return res.status(404).json({ status: 'fail', message: 'Not found' });
  cars.splice(index, 1);
  res.status(204).send();
});

Fazit

Die vier CRUD-Handler (POST, GET, PUT, PATCH) sowie der Delete-Handler (DELETE) wurden erfolgreich implementiert und auf dem Raspberry Pi deployed. Die API arbeitet rein mit einem JSON-Array im Speicher – eine persistente Datenbankanbindung folgt in einem späteren Schritt.