Database Reference
In-Depth Information
Pre-/Post-Commit-Hooks
Riak kann die Daten über sog. Hooks vor oder nach dem Speichern eines
Objekts umwandeln. Pre- und Post-Commit-Hooks sind einfache JavaScript-
(oder Erlang-)Funktionen, die vor oder nach dem Commit ausgeführt werden.
Pre-Commit-Funktionen können das eingehende Objekt in irgendeiner Form
modifizieren (und sogar einen Fehler auslösen), während Post-Commits auf
einen erfolgreichen Commit reagieren (etwa in einen Log schreiben oder eine
E-Mail senden) können.
Jeder Server besitzt eine
app.config
-Datei, in der die Lage eigener Java-
Script-Codes festgelegt wird. Öffnen Sie diese Datei zuerst für Server dev1
unter
dev/dev1/etc/app.config
, und suchen Sie die Zeile, die
js
_
source
_
dir
enthält. Tragen Sie dort den gewünschten Verzeichnispfad ein. Beachten Sie,
dass diese Zeile mit einem %-Zeichen auskommentiert sein kann, d. h., Sie
müssen die Zeile evtl. zuerst aktivieren, indem Sie dieses Zeichen löschen.
Unsere Zeile sieht wie folgt aus:
{js
_
source
_
dir, "~/riak/js
_
source"},
Sie müssen diese Änderung dreimal vornehmen, einmal für jeden dev-Server.
Wir wollen einen Validator entwickeln, der pre-commit ausgeführt wird. Er
parst die Daten und stellt sicher, dass es eine Bewertung gibt und dass sie
im Bereich von 1 bis 4 liegt. Wird eines dieser Kriterien nicht erfüllt, wird ein
Fehler ausgelöst und unser Validator gibt ein JSON-Objekt zurück, das aus
{"fail" : message}
besteht, wobei
message
die Nachricht ist, die wir an den
Benutzer zurückgeben wollen. Erfüllen die Daten die Bedingungen, geben
wir nur das Objekt zurück und Riak speichert den Wert.
riak/my_validators.js
function
good
_
score(object) {
try
{
/
*
Daten aus dem Riak-Objekt ziehen und als JSON parsen
*
/
var
data = JSON.parse( object.values[0].data );
/
*
Fehler, wenn keine Bewertung vorliegt
*
/
if
( !data.score || data.score ===
''
){
throw
(
'Score is required'
);
}
/
*
Fehler, wenn Bewertung nicht im gültigen Wertebereich liegt
*
/
if
( data.score < 1 || data.score >4){
throw
(
'Score must be from 1 to 4'
);
}
}
catch
( message ) {
/
*
Riak erwartet bei einem Fehler die folgenden JSON-Daten
*
/
return
{
"fail"
: message };
}
/
*
Keine Probleme, also weitermachen
*
/
return
object;
}