Eine REST API mit Node.js, Express und MongoDB programmieren

Profil

geschrieben von Gabriel Grimm

veröffentlicht am 9. Juni 2022

Header-Image

In diesem Beitrag zeige ich dir wie, man mit Node.js, Express und MongoDB eine API erstellt. Bevor wir anfangen gebe ich euch jedoch noch eine kleine Zusammenfassung von APIs und den Technologien die wir benutzen werden.


Was ist eine API?

Eine API (Application Programming Interface) ist der Endpunkt einer Software, der es dir ermöglicht, mit dieser Software zu interagieren. In unserem Fall werden wir die API benutzen, um Daten für eine imaginäre Webseite abzurufen und zu manipulieren.


Im Frontend wird eine Anfrage an die API mit einer der oben genannten Methoden, sowie der URL der API gemacht. Die API schickt dann eine Anfrage an die Datenbank mit den gewünschten Daten und schickt diese dann als JSON- oder XML-Objekt.

Die 4 bekanntesten API-Methoden sind GET, POST, PUT, DELETE:

Was ist Node.js?

Node ist eine Laufzeitumgebung, die es ermöglicht Javascript-Code, außerhalb eines Browsers auszuführen und somit nun auch im Backend einer Webseite verwendet werden kann. Um das zu ermöglichen, benutzt Node den sogenannten V8-Engine, welcher den Javascript-Code bei der Ausführung in Maschinensprache kompiliert.


Was ist MongoDB?

MongoDB ist eine No-SQL Datenbank. No-SQL bedeutet, dass die Daten in Sammlungen von JSON-Dokumenten gespeichert wird, anstelle von Tabellen in Reihen und Spalten. Falls du mehr über die Unterschiede zwischen SQL und No-SQL wissen willst, kannst du dir einen anderen Beitrag von mir anschauen:


...

SQL vs NoSQL - Blog

Was sind SQL-Datenbanken  SQL-Datenbanken, auch relationale Datenbanken genannt, bestehen aus festen Tabellen. Diese Tabellen sind durch Beziehungen miteinander verbunden. Wenn man nun bestimmte Informationen braucht, werden alle benötigten Date


Was ist NPM?

Der "Node Package Manager" ermöglicht es, dir den Code von anderen Programmieren ganz einfach, als Paket zu installieren und zu verwenden. NPM verwaltet die Code-Pakete und stellt diese in deinem Projekt zu Verfügung.


Installation

Node.js und NPM


​MongoDB

Photo by Douglas Lopes on Unsplash


Let's get started!

Nachdem du alles, was wir brauchen installiert hast, können wir endlich anfangen.


Erstellung eines Node-Projekts

Als Erstes müssen wir ein Node-Projekt erzeugen. Um dies zu tun, erstellst du einen neuen Ordner und öffnest die Kommandozeile im vorhin erstellten Ordner.

Gib folgenden Command ein.



Hier erstellen wir ein neues Node-Projekt. Mit "-y" werden alle Fragen, die während des Erzeugens des Projekts gestellt werden automatisch mit ja beantwortet.


Installation von Node-Paketen

Als nächstes installieren wir die benötigten Paketen. Wenn man eine bestimmte Version von einem Paket haben will, kann man dies mit <paket-name@version> machen.


Erstellung einer MongoDB Datenbank

Um eine neue Datenbank für unsere API zu erstellen, müssen wir erstmal in die Mongo-Shell. Um diese zu starten, öffnen wir die Kommandozeile und geben mongo ein.



Wenn bei der Installation alles gut gegangen ist, solltest du mit deiner lokalen Installation von MongoDB interagieren können.

Mit dem Command > show dbs kannst du dir deine Datenbanken anzeigen lassen.



Eine neue Datenbank erstellst du indem du > use <datenbank name> eingibst.



Nachdem die Datenbank erstellt wurde, taucht diese aber nicht in der Liste auf. Das liegt daran, dass die Datenbank erst angezeigt wird, sobald eine Kollektion in der Datenbank mit einem Dokument gespeichert wurde. 



Hier erstelle ich eine Kollektion namens "Profile" in der Datenbank und speichere ein Dokument. Der Inhalt des Dokuments wird von den in den Klammern stehenden Daten bestimmt.



Wenn wir jetzt nochmal die Liste abrufen, sehen wir, dass die Datenbank angezeigt wird.

Das wärs schon mit der Datenbank. Als Nächstes verbinden wir unsere Datenbank mit der API.


Verbindung zur API herstellen

In unserem Projekt-Ordner hat sich was getan. Im "node_modules"-Ordner werden alle Pakete gespeichert, die wir installiert haben und in der package.json werden diese Pakete aufgelistet zusammen mit deren Version.



Als Nächstes erstellen wir einen weiteren Ordner, in welcher unsere Datei für die Datenbankverbindung sein wird.



In db.js importieren wir mongoose und stellen mit .connect() eine Verbindung zur Datenbank her. Mit .then() wird, wenn die Verbindung gelungen ist "MongoDB verbunden." in der Konsole ausgegeben und mit .catch() wird, falls es zu einem Error kommt, dieser auch in der Konsole ausgegeben.



Um die Datenbank jedoch verwenden zu können, müssen wir ein Model erstellen. Im Model wird die Struktur unserer Dokumente, die in der Datenbank gespeichert werden festgelegt.

In dem Schema habe ich festgelegt, dass ein Name und Benutzername (Username) gespeichert werden kann. Beide müssen Strings sein. Das Model erhält einen Namen und kriegt als weiteren Parameter das Schema. In der letzten Zeile wird die Kollektion erstellt.



Um das Model in der API verwenden zu können, müssen wir diese exportieren.



Express-API erstellen

Nachdem unsere Datenbankverbindung steht, fangen wir endlich mit der eigentlichen API an. Dazu erstellen wir einen Ordner namens "src". In den Ordner kommt dann eine Datei mit dem Namen "app.js".


In app.js importieren wir express und erstellen eine Express-Applikation mit der Funktion express().



Damit während der Entwicklungsphase keine Probleme beim Testen über verschiedene Domains auftauchen, importieren wir cors. Mit app.use() sagen wir Express, dass es cors() als Middleware verwenden soll.



Um Daten empfangen und im Code verwenden zu können, muss eine weitere Middleware hinzugefügt werden.



Jetzt können Daten in JSON-Form von der API verarbeitet werden.

Mit app.listen() sagen wir Express, dass es auf einem bestimmten Port für Anfragen horchen soll. In diesem Fall ist es 3000, wenn in der Umgebung nicht bereits ein Port festgelegt wurde. Sofern alles funktioniert sollten wir in der Konsole "Listening on port 3000..." sehen.



Um die API zu starten, geben wir $ node src/app.js in der Konsole ein.



Und wie wir sehen, hat es nicht funktioniert. Das Problem ist, dass diese Weiße zu importieren nur in Modulen erlaubt ist. Um das zu ändern, gehen wir in die package.json und fügen "type": "module" hinzu.



So, jetzt funktioniert es und wir sehen, dass Express auf Port 3000 horcht.



Request-Handler erstellen

Als Nächstes müssen wir Funktionen erstellen die, die Request je nach Request-Methode verarbeiten.



Schauen wir uns mal die Request-Handler genauer an. An welchen Handler die Request gehen wird, ist von der Methode anhängig. GET-Requests gehen an app.get() etc. Der erste Parameter '/' heißt, dass dieser Handler für Requests an http://localhost:3000 verwendet wird. Würde im Parameter '/user' stehen, würden nur GET-Requests an http://localhost:3000/user von diesem Handler verarbeitet werden.

Der zweite Parameter (req, res) ⇒ {} ist eine Funktion, die vom Handler ausgeführt wird, sobald eine passende Request eintrifft. req beinhaltet die Daten von der Request und mit res werden die gewünschten Daten zurückgeschickt.

Deine app.js sollte im Moment so aussehen.



Datenbankmodell verwenden

Um das Datenbankmodell in der API verwenden zu können, muss dieses erstmal importiert werden.



Um die gespeicherten Profile zu bekommen, müssen wir den app.get()Handler modifizieren. Zuerst ändern wir die URL. Wir fügen als Endpunkt /users hinzu, damit jeder der die API benutzt weiß, dass hier alle User zurückgegeben werden.


GET-Handler

Jetzt kann die Funktion mit curl getestet werden.


Nachdem die Request ausgeführt wurde, kann man als Nächstes, den zurückgegeben Wert sehen. Es sollte der Eintrag den wir bei der Erstellung der Datenbank eingefügt haben angezeigt werden. Wenn nichts zurückgegeben wird, kann es sein, dass eine neue Kollektion erstellt wurde.


POST-Handler

Als Nächstes wird der POST-Handler modifiziert.

Als Endpunkt fügen wir /user hinzu. Hier soll man dazu in der Lage sein einen neuen User hinzuzufügen.



Die Daten vom neuen User befinden sich im Body der Request und können so wie im Bild gezeigt verwendet werden. Mit den Daten wird ein neues Modellobjekt, welches zur von uns erstellten Schema passen sollte, erzeugt und gespeichert. Konnte der User erfolgreich gespeichert werden, dann wird "User added!" zurückgeschickt. Gab es Probleme, wird der Error zurückgeschickt.



In der Mongo-Shell können wir überprüfen, ob der neue User gespeichert wurde.



Sieht so aus, wie als hätte es geklappt. Peter Park wurde als neuer User hinzugefügt.


PUT-Handler

Damit Peter Park aber seinen Benutzernamen bei Bedarf wieder ändern kann, müssen wir den PUT-Handler anpassen.



Im obigen Bild suchen wir nach einem Dokument, zu dem der Name in der Request passt und tauschen den Benutzernamen mit dem in der Request aus.



Peter Parks Benutzername ist jetzt nicht mehr "peterpark", sondern "peterpeter".


DELETE-Handler

Zum Schluss muss noch der DELETE-Handler angepasst werden, sodass Peter Park auch sein Profil löschen kann.



Nachdem das Dokument gelöscht wurde, wird entweder als Bestätigung "User deleted!" zurückgeschickt oder der Error, falls es nicht funktioniert hat.



Wie geht's weiter?

Hier sind ein paar Ideen, die du umsetzen könntest, um die API zu erweitern:

Author

Gabriel Grimm

Ein Projekt im Sinn?

Sprecht uns an!