SLaPP – Eine RESTful API mit NodeJS, Express und MongoDB

2 Mrz

Die Umstellung von SLaPP als NodeJS Applikation zu SLaPP als RESTful API war doch aufwändiger als gedacht. Bis zum Zeitpunkt der Umstellung hatte ich das mongoose Modul für Node benutzt, um mit MongoDB zu arbeiten, was auch immer sehr zuverlässig funktioniert hat. Da ich aber Dateien in der Datenbank speichern muss und mongoose keine Funktionialität für GridFS (Grid File Store, Spezifikation um Dateien in der Datenbank zu speichern) bereitstellt und auf der Prioritätenliste anscheinend auch nicht sonderlich weit oben steht musste ich auf node-mongodb-native (kurz mongodb) umsteigen. Zu der Zeit war die stabile Version (und jetzt auch noch immer) 0.9.8-3 im Node Packet Manager aktuell. Da ich mit mongoose GridFS nicht benutzt habe und auch nicht konnte ist es mir auch erst nicht aufgefallen, dass die Funktionalität von GridFS in dieser Version teilweise defekt war. Nachdem ich einige Tage jedes Code-Snippet ausprobiert habe, dass ich im Internet gefunden habe und GridFS noch immer nicht funktioniert hat gab es endlich ein Update. Mit der Version 0.9.9-4 funktioniert jetzt auch wieder das auslesen der Dateien aus der Datenbank. Mittlerweile benutze ich node-mongodb-native nicht nur wegen des funktionierenden GridFS gerne, auch die Syntax innerhalb von Node ist sehr nah an der in der Kommandozeile angelehnt und somit auch einfach zu bedienen. Wenn man von mongoose kommt ist es doch etwas gewöhnungsbedürftig, aber durch die Kommandozeile schnell erlernt.

Zum Zeitpunkt dieses Blogeintrags sind alle CRUD-Befehle (Create, Read, Update, Delete) für die Arbeit mit PDF und TeX Dokumenten implementiert. Der nächste Schritt wäre die API in einer Beispielapplikation, auch in Node geschrieben, zu nutzen, um noch fehlende Funktionen zu finden und zu implementieren.

Was ist REST?

Um diese Frage zu beantworten möchte ich auf den Blog-Eintrag von Ryan Tomayko How I explained REST to my wife verlinken. Dieser Eintrag ist zwar schon etwas über sieben Jahre alt, aber trifft es eigentlich genau auf den Punkt.

Wie benutzt man PUT und DELETE in HTML?

Zwischenzeitlich waren PUT und DELETE funktionierende Parameter für das method-Attribut in einem form-Tag. Mittlerweile sind diese nicht mehr unterstützt und es funktionieren nur noch GET und POST. Für einen großen Teil der Browser gibt es einen Workaround. Man sendet das Formular mit POST als Methode ab und übergibt in einem versteckten Feld PUT bzw. DELETE.

<form method="POST" action="http://localhost:3000/api/restful/link">
<label>Update text</label><br />
<input type="text" name="update" /><br />
<input type="hidden" name="_method" value="PUT" />
<input type="submit" name="submit" value="update" />
</form>

Eine weitere Methode PUT und DELETE in HTML nutzen zu können wäre über die ajax-Methode von jQuery, die aber leider nicht in jedem Browser funktioniert.

$.ajax({
url: '/api/restful/link',
type: 'PUT'
success: function(result) {
// tue etwas mit dem Ergebnis
}
});

Wie greife ich in Node auf die API zu?

Node bietet dafür das http-Modul an. Vor Version 0.4.x gab es die Funktion createClient(options, callback), welche mit aktuellen Versionen immer noch funktioniert, aber seit der besagten Version nicht mehr unterstützt wird und dementsprechend noch fehlerhaft ist. Mit den neueren Versionen wird die Funktion request(options, callback) benutzt. Um beispielsweise den API-Key für die API im Header zu versenden kann man wie folgt vorgehen:

var options = { host: 'localhost',
port: 3000,
path: '/api/apikey',
method: 'POST',
headers: {'apikey':'abc12345'}
};
var req = http.request(options, function(res) {
res.setEncoding('utf8');
res.on('data', function(chunk) {
if (JSON.parse(chunk).authentication == 'successful')
console.log('Connection to API server established.');
else
console.log('Couldn\'t connect to API server.');
});
});

Anmerkung: JSON.parse(chunk).authentication == ’successful‘ funktioniert hier nur, weil der Datenaustausch in der SLaPP API über JSON läuft und die Antwort im Format { authentication: ’successful‘ } bzw. { authentication: ‚failed‘ } zurückgegeben wird.

6 Antworten to “SLaPP – Eine RESTful API mit NodeJS, Express und MongoDB”

  1. michaelupb 2. März 2012 um 11:06 #

    Nur zum Verständnis, benutzt du Node als Client *für* eine REST-API oder stellst du mit Node *die* API bereit ?

    • martensa 2. März 2012 um 11:11 #

      Mit Node stelle ich die API bereit. Und der Client für die API wird auch in Node geschrieben, wobei der Client hauptsächlich für die Demo bei der mündlichen Prüfung ist, um zu zeigen, dass die API funktioniert und wie man die API (in diesem Fall mit Node) benutzen kann.

      • michaelupb 2. März 2012 um 11:15 #

        Nutzt du für die Bereistellung der API sowas wie Express oder nimmst du dafür das Node http Modul ?

  2. martensa 2. März 2012 um 11:21 #

    Dafür wird Express benutzt. Da bin ich jetzt nicht näher drauf eingegangen, hätte ich vielleicht machen sollen. Das http Modul brauche ich nur für den Client, um die GET, POST, PUT und DELETE Requests an die API zu senden.

    • michaelupb 2. März 2012 um 11:27 #

      Alles klar Es laß sich im ersten Augenblick so, als würdest du die API mit dem http Modul bereitstellen :)

      Aber auch auf der Clientseite brauchst du normal nicht soweit runter. Guck dir mal TJ’s superagent an (https://github.com/visionmedia/superagent). Die Beschreibung sagt eigentlich schon alles

      node.js HTTP client with less suck

      Vielleicht kannst du damit deinen Clientpart noch weiter vereinfachen. Ich nutze das selber für automatisierte Tests gegen eine Express-REST-API.

      • martensa 2. März 2012 um 11:29 #

        Cool, danke für den Hinweis. Ich werd mir das Modul mal anschauen.

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: