Tag Archives: mongodb

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.

Zeitserienvisualisierung mit Cube

7 Dez

Heute bin ich über ein sehr interessantes Projekt zur Visualsierung von Zeitserien gestoßen, dass dazu noch technologisch sehr interessant ist. Cube baut auf Node.js, MongoDB und D3.js auf und erlaubt die schnelle Erzeugung recht ansprechender Visualisierungen, die in verschiedenen Kontexten eingesetzt werden können. Die Entwickler selbst beschreiben Cube als:

an open-source system for visualizing time series data, built on MongoDB, Node and D3. If you send Cube timestamped events (with optional structured data), you can easily build realtime visualizations of aggregate metrics for internal dashboards. Cube speaks WebSockets for low-latency, asynchronous input and output: new events are streamed in, and requested metrics are streamed out as they are computed. (You can also POST events to Cube, if that’s your thing, and collectd integration is included!) Metrics are cached in capped collections, and simple reductions such as sum and max use pyramidal aggregation to improve performance. Visualizations are generated client-side and assembled into dashboards with a few mouse clicks.

Es gibt auch ein typisches „Was kann man cooles in 60 Sekunden mit unserem Tool machen?“ Video, welches tatsächlich nur 31 Sekunden lang ist. Macht schon echt nen coolen Eindruck, oder?