Archiv nach Autor

SLaPP – Eine RESTful API mit NodeJS, Express und MongoDB

2 Mär

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.

Nide – NodeJS IDE

24 Jan

Momentan benutze ich Sublime Text 2 als IDE zum programmieren, da mir aber die integrierte API für die wichtigsten NodeJS Module (express, mongoose, connect, etc.) fehlt und ich bisher noch kein NodeJS Plugin gefunden habe, habe ich mich auf die Suche nach einer geeigneten IDE gemacht und bin dabei auf Nide gestoßen.

Weiterlesen

SLaPP – Aktueller Stand

24 Jan

Mittlerweile sind die ersten fünf Wochen der Bearbeitungszeit vorbei und ich möchte euch jetzt einen Überblick darüber geben, was ich bisher geschafft habe.

Da ich Javascript bisher immer wegen der DOM gemieden habe, war die Einarbeitungszeit in NodeJS und Javascript doch etwas länger als geplant. Dank der zahlreichen Beiträge bei Stack Overflow und den Beispielen auf den jeweiligen Webseiten der NodeJS Module, sowie diversen Ebooks und Tutorials, die ich in einem gesonderten Post veröffentliche, ließ sich relativ schnell ein Fortschritt erkennen.

Weiterlesen

Bachelorarbeit: Entwurf und Entwicklung eines Web-Services zur Erstellung von Mehr-Autor-Werken basierend auf einzelnen Einreichungen

2 Jan

Da die Bearbeitungszeit meiner Bachelorarbeit bereits offiziell begonnen hat möchte ich euch einen Überblick über mein Thema geben. Kurz gesagt geht es um die Problematik beim Erstellen eines Konferenzbandes mit dem Ziel einen Web-Service zu entwerfen und zu implementieren, der dem Konferenzveranstalter und den Teilnehmern der Konferenz den Aufwand bei der Erstellung eines solchen Bandes erspart. Der Name des Web-Services lautet Service for LaTeX Proceedings Preparation, kurz SLaPP. Weiterlesen