Costruire una pipeline di elaborazione con i transform
Un transform è una catena di passaggi con un nome. NEWTRANSFORM(name, fn, [id]) aggiunge un passaggio alla catena name; i passaggi vengono eseguiti nell'ordine di registrazione, e ciascuno riceve l'oggetto delle opzioni $ e il valore corrente. Cambia il valore con $.value = ... e chiama $.next() per proseguire con il passaggio successivo. $.invalid(message) aggiunge un errore. TRANSFORM(name, value) avvia la catena e restituisce una promise con il valore finale; la promise viene rifiutata quando un passaggio ha segnalato un errore. Con una callback invece, TRANSFORM(name, value, function(err, value) {}). Un nome senza alcun passaggio restituisce il valore così com'è.
Usalo per il lavoro che deve poter essere esteso da più punti, come la pulizia di un commento prima di salvarlo: un filtro antispam, un rifilatore di spazi e un controllo dei link possono ciascuno vivere nel proprio file ed essere aggiunti o rimossi senza toccare il codice che chiama TRANSFORM(). L'id facoltativo permette di rimuovere un passaggio in seguito con NEWTRANSFORM(name, null, id).
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();
}