Eine Verarbeitungspipeline mit Transforms bauen
Ein Transform ist eine benannte Kette von Schritten. NEWTRANSFORM(name, fn, [id]) fügt der Kette name einen Schritt hinzu; die Schritte laufen in der Reihenfolge ihrer Registrierung, und jeder erhält das Optionsobjekt $ und den aktuellen Wert. Ändere den Wert mit $.value = ... und rufe $.next() auf, um mit dem nächsten Schritt fortzufahren. $.invalid(message) fügt einen Fehler hinzu. TRANSFORM(name, value) startet die Kette und gibt ein Promise mit dem Endwert zurück; das Promise wird abgelehnt, wenn ein Schritt einen Fehler gemeldet hat. Mit einem Callback stattdessen TRANSFORM(name, value, function(err, value) {}). Ein Name ohne Schritte gibt den Wert unverändert zurück.
Nutze es für Arbeit, die von mehreren Stellen aus erweiterbar sein muss, etwa das Bereinigen eines Kommentars vor dem Speichern: Ein Spamfilter, ein Trimmer und ein Link-Prüfer können jeweils in einer eigenen Datei leben und hinzugefügt oder entfernt werden, ohne den Code anzufassen, der TRANSFORM() aufruft. Mit der optionalen id kannst du einen Schritt später mit NEWTRANSFORM(name, null, id) entfernen.
NEWTRANSFORM('comment', function($, value) {
$.value = value.trim();
$.next();
}, 'trim');
NEWTRANSFORM('comment', function($, value) {
if (/spam/i.test(value))
$.invalid('Spam is not allowed');
$.next();
}, 'spam');
NEWTRANSFORM('comment', function($, value) {
$.value = value.replace(/\s+/g, ' ');
$.next();
}, 'spaces');exports.install = function() {
ROUTE('POST /comment/ @json', comment);
ROUTE('DELETE /comment/spaces/', remove_step);
};
async function comment($) {
try {
var text = await TRANSFORM('comment', $.body.text);
$.json({ text: text });
} catch (err) {
$.json({ error: true });
}
}
function remove_step($) {
NEWTRANSFORM('comment', null, 'spaces');
$.success();
}